diff --git a/solutions/day01/example.txt b/solutions/day01/example.txt new file mode 100644 index 0000000..7bbc69a --- /dev/null +++ b/solutions/day01/example.txt @@ -0,0 +1,4 @@ +1abc2 +pqr3stu8vwx +a1b2c3d4e5f +treb7uchet diff --git a/solutions/day01/example2.txt b/solutions/day01/example2.txt new file mode 100644 index 0000000..41aa89c --- /dev/null +++ b/solutions/day01/example2.txt @@ -0,0 +1,7 @@ +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen diff --git a/solutions/day01/solution.nim b/solutions/day01/solution.nim new file mode 100644 index 0000000..0a5d0a1 --- /dev/null +++ b/solutions/day01/solution.nim @@ -0,0 +1,56 @@ +import std/[strutils] + +const example* = slurp("example.txt").strip() +const example2* = slurp("example2.txt").strip() +const input* = slurp("input.txt").strip() + +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]) + +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