Nim
Another simple one.
Part 1: count each time a beam crosses a splitter.
Part 2: keep count of how many particles are in each column in all universes
(e.g. with a simple 1d array), then sum.
Runtime: 116 μs 95 µs 86 µs
old version
type
AOCSolution[T,U] = tuple[part1: T, part2: U]
proc solve(input: string): AOCSolution[int, int] =
var beams = newSeq[int](input.find '\n')
beams[input.find 'S'] = 1
for line in input.splitLines():
var newBeams = newSeq[int](beams.len)
for pos, cnt in beams:
if cnt == 0: continue
if line[pos] == '^':
newBeams[pos-1] += cnt
newBeams[pos+1] += cnt
inc result.part1
else:
newbeams[pos] += cnt
beams = newBeams
result.part2 = beams.sum()
Update: found even smaller and faster version that only needs a single array.
Update #2: small optimization
type
AOCSolution[T,U] = tuple[part1: T, part2: U]
proc solve(input: string): AOCSolution[int, int] =
var beams = newSeq[int](input.find '\n')
beams[input.find 'S'] = 1
for line in input.splitLines():
for pos, c in line:
if c == '^' and beams[pos] > 0:
inc result.part1
beams[pos-1] += beams[pos]
beams[pos+1] += beams[pos]
beams[pos] = 0
result.part2 = beams.sum()
Full solution at Codeberg: solution.nim