Files
zern/examples/puzzles/aoc2024_07.zr
2026-06-06 18:53:11 +02:00

77 lines
2.0 KiB
Plaintext

func concat[a: i64, b: i64] : i64
ab_str := _stackalloc(50) as str
io.snprintf(ab_str, 50, "%d%d", a, b)
return str.parse_i64(ab_str)
func solve[ops: Array, e: Array] : i64
e_1 : Array = array.nth(e, 1)
n := e_1->size - 1
indices := []
for i in 0..n
array.push(indices, 0)
while true
res : i64 = array.nth(e_1, 0)
for i in 0..n
op : str = array.nth(ops, array.nth(indices, i))
if str.equal(op, "add")
res += array.nth(e_1, i + 1)
else if str.equal(op, "mul")
res = res * array.nth(e_1, i + 1)
else if str.equal(op, "concat")
res = concat(res, array.nth(e_1, i + 1))
if res == array.nth(e, 0)
return res
done := true
i := n - 1
while i >= 0
array.set(indices, i, array.nth(indices, i) + 1)
if array.nth(indices, i) < ops->size
done = false
break
array.set(indices, i, 0)
i -= 1
if done
return 0
func part1[equations: Array] : void
out := 0
for i in 0..equations->size
out += solve(["add", "mul"], array.nth(equations, i))
io.println_i64(out)
func part2[equations: Array] : void
out := 0
for i in 0..equations->size
out += solve(["add", "mul", "concat"], array.nth(equations, i))
io.println_i64(out)
func main[] : i64
~input, ok := io.read_text_file("input.txt")
if !ok
panic("failed to open input.txt")
lines := str.split(input, "\n")
equations := []
for i in 0..lines->size
line : str = array.nth(lines, i)
parts := str.split(line, ": ")
xs := str.split(array.nth(parts, 1), " ")
for j in 0..xs->size
array.set(xs, j, str.parse_i64(array.nth(xs, j)))
array.push(equations, [str.parse_i64(array.nth(parts, 0)), xs])
part1(equations)
part2(equations)