

Nim
For part 3 I parse gears as tuples, with regular gears having same value on both ends e.g.
3|5 -> (3, 5)
3 -> (3, 3)
proc parseGears(input: string): seq[int] =
for line in input.splitLines():
result.add parseInt(line)
proc parseNestedGears(input: string): seq[(int, int)] =
for line in input.splitLines():
let nested = line.split('|').mapIt(it.parseInt)
result.add:
if nested.len == 1: (nested[0], nested[0])
else: (nested[0], nested[1])
proc solve_part1*(input: string): Solution =
let gears = parseGears(input)
result := 2025 * gears[0] div gears[^1]
proc solve_part2*(input: string): Solution =
let gears = parseGears(input)
result := ceil(10000000000000'f64 / (gears[0] / gears[^1])).int
proc solve_part3*(input: string): Solution =
let gears = parseNestedGears(input)
let ratios = (0..gears.high-1).mapIt(gears[it][1] / gears[it+1][0])
result := int(100 * ratios.prod)
Full solution at Codeberg: solution.nim










Nim
Nothing fancy. Simple iterative tree construction and sort, using the
std/algorithmand a custom<operator on types.Full solution at Codeberg: solution.nim