diff --git a/2023/day15.nim b/2023/day15.nim new file mode 100644 index 0000000..1ca7d4e --- /dev/null +++ b/2023/day15.nim @@ -0,0 +1,53 @@ +import std/algorithm +import std/deques +import std/enumerate +import std/math +import std/options +import std/sequtils +import std/sets +import std/strscans +import std/strutils +import std/sugar +import std/tables +import std/terminal + +proc dbg[T](v: T): T = (echo(v); v) + +func empty[T](v: seq[T]): bool = v.len == 0 + +proc split[T](v: seq[T], pred: proc(elt: T): bool {.noSideEffect.}): seq[seq[T]] = + var current: seq[T] + for elt in v: + if pred(elt): + result.add current + current = @[] + else: + current.add elt + result.add current + +func join[T](parts: seq[seq[T]], sep: T): seq[T] = + if parts.len > 0: + result &= parts[0] + + for part in parts[1..^1]: + result.add sep + result &= part + +type Init = tuple + steps: seq[string] + +func parseInit(text: string): Init = + result.steps = text.strip.split(',') + +func hash(step: string): int = + for c in step: + result = ((result + c.ord) * 17) mod 256 + +proc part1(input: string): int = + let text = readFile(input) + let init = parseInit(text) + + init.steps.map(hash).sum + +echo part1("input/test.txt") +echo part1("input/day15.txt")