2023-12-01 06:36:49 -06:00
|
|
|
import std/[strutils]
|
|
|
|
|
2023-12-04 17:41:45 -06:00
|
|
|
import ../aoc
|
2023-12-01 06:36:49 -06:00
|
|
|
|
|
|
|
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])
|
|
|
|
|
2023-12-04 17:41:45 -06:00
|
|
|
solve:
|
2023-12-05 11:32:47 -06:00
|
|
|
"example.txt":
|
2023-12-04 17:41:45 -06:00
|
|
|
partOne: 142
|
2023-12-05 11:32:47 -06:00
|
|
|
"example2.txt":
|
2023-12-04 17:41:45 -06:00
|
|
|
partTwo: 281
|
2023-12-05 11:32:47 -06:00
|
|
|
"input.txt":
|
2023-12-04 17:41:45 -06:00
|
|
|
partOne: 54597
|
|
|
|
partTwo: 54504
|