diff --git a/2023/day02.nim b/2023/day02.nim new file mode 100644 index 0000000..93d4924 --- /dev/null +++ b/2023/day02.nim @@ -0,0 +1,61 @@ +import std/strscans +import std/strutils + +proc part1(): int = + let f = open("input/day02.txt") + defer: f.close() + + let + reds = 12 + greens = 13 + blues = 14 + + var line: string + while f.readLine(line): + var id: int + var rest: string + + block game: + if not scanf(line, "Game $i: $*$.", id, rest): + echo "ERROR" + continue + + for counts in rest.split(";"): + var r, g, b: int + for s in counts.split(","): + let parts = s.strip.split() + case parts[1]: + of "red": (if parts[0].parseInt > reds: break game) + of "green": (if parts[0].parseInt > greens: break game) + of "blue": (if parts[0].parseInt > blues: break game) + inc result, id + +proc part2(): int = + let f = open("input/day02.txt") + defer: f.close() + + var line: string + while f.readLine(line): + var id: int + var rest: string + + if not scanf(line, "Game $i: $*$.", id, rest): + echo "ERROR" + continue + + var reds, greens, blues: int + + for counts in rest.split(";"): + var r, g, b: int + for s in counts.split(","): + let parts = s.strip.split() + case parts[1]: + of "red": (reds = max(reds, parts[0].parseInt)) + of "green": (greens = max(greens, parts[0].parseInt)) + of "blue": (blues = max(blues, parts[0].parseInt)) + + let power = reds * greens * blues + inc result, power + +echo part1() +echo part2()