advent-of-code-2024/solutions/day03/solution.nim

91 lines
2.2 KiB
Nim
Raw Permalink Normal View History

2024-12-03 21:23:50 -06:00
import std/[strutils, sequtils, math]
import aoc
proc parseInstruction(i: string): (int, int) =
let s = i.split(',')
assert s.len == 2
result = (parseInt(s[0]), parseInt(s[1]))
proc parseInput(input: string): seq[(int, int)] =
var i: int
while i < input.len:
case input[i]
of 'm':
# ul(x,y)
# not enough space so bail
if i > (input.len - 6): return
else:
var instruction: string
if input[i .. i+3] == "mul(":
i += 4
while true:
let c = input[i]
case c:
of '0'..'9':
instruction.add c; inc i
of ')':
result.add parseInstruction instruction
break
of ',':
instruction.add c; inc i
else: break
inc i
else: inc i
proc partOne*(input: string): int =
let instructions = parseInput(input)
instructions.mapIt(it[0] * it[1]).sum()
2024-12-03 22:06:28 -06:00
proc parseInput2(input: string): seq[(int, int)] =
var i: int
var working = true
while i < input.len:
case input[i]
of 'd':
# check for enough room for don't()
if i > (input.len - 6): inc i
else:
if input[i .. i + 3] == "do()":
working = true
i += 3
elif input[i .. i + 6] == "don't()":
working = false
i += 6
inc i
of 'm':
# ul(x,y)
# not enough space for instruction so bail
if i > (input.len - 6): return
else:
var instruction: string
if input[i .. i+3] == "mul(":
i += 4
while true:
let c = input[i]
case c:
of '0'..'9':
instruction.add c; inc i
of ')':
if working:
result.add parseInstruction instruction
break
of ',':
instruction.add c; inc i
else: break
inc i
else: inc i
proc partTwo*(input: string): int =
let instructions = parseInput2(input)
instructions.mapIt(it[0] * it[1]).sum()
2024-12-03 21:23:50 -06:00
solve:
"example.txt":
partOne: 161
2024-12-03 22:06:28 -06:00
"example2.txt":
partTwo: 48
2024-12-03 21:23:50 -06:00
"input.txt":
2024-12-03 22:06:28 -06:00
partOne: 164730528
partTwo: 70478672