import std/[strutils] import ../aoc proc parseInput(input: string): seq[string] = input.split("\n") proc partOne*(input: string): int = let lines = parseInput(input) for line in lines: var digits: seq[char] for c in line: case c of '0'..'9': digits.add c else: discard result += parseInt(digits[0] & digits[^1]) type Number = enum zero = 0, one, two, three, four, five, six, seven, eight, nine proc partTwo*(input: string): int = let lines = parseInput(input) for line in lines: var digits: seq[char] var i: int while i < line.len: let c = line[i] case c of '0'..'9': digits.add c inc i else: for number in Number.low..Number.high: if line[i..^1].startsWith($number): digits.add $number.ord # some numbers share chars # let's jump back an extra index to catch them i += len($number)-2 break inc i result += parseInt(digits[0] & digits[^1]) const example2 = slurp("example2.txt").strip() solve: example: partOne: 142 example2: partTwo: 281 input: partOne: 54597 partTwo: 54504 # when isMainModule: # import std/unittest # suite "day 1": # test "part one": # check partOne(example) == 142 # check partOne(input) == 54597 # test "part two": # check partTwo(example2) == 281 # check partTwo(input) == 54504