diff --git a/solutions/aoc.nim b/solutions/aoc.nim new file mode 100644 index 0000000..7f0a977 --- /dev/null +++ b/solutions/aoc.nim @@ -0,0 +1,36 @@ +import std/[strutils, os, macros, terminal] + +template loadInputs*(): untyped = + const callPath = getProjectPath() + const example* {.inject.} = slurp(callPath / "example.txt").strip() + const input* {.inject.} = slurp(callPath / "input.txt").strip() + +template solveInput*(input: string, p1: untyped, p2: untyped): untyped = + assert partOne(input) == p1 + assert partTwo(input) == p2 + +macro solve*(arg: untyped): untyped = + arg.expectKind nnkStmtList + result = newStmtList() + for stmt in arg: + stmt.expectKind nnkCall + stmt[0].expectKind nnkIdent + if not (stmt[0].eqIdent("example") or stmt[0].eqIdent("input")): + error "Invalid input identifier: " & stmt[0].strVal + stmt[1].expectKind nnkStmtList + for inputs in stmt[1]: + inputs.expectKind nnkCall + inputs[0].expectKind nnkIdent + inputs[1].expectKind nnkStmtList + let + part = inputs[0] + puzzleInput = stmt[0] + output = inputs[1][0] + msg = newLit(part.repr & "|" & puzzleInput.repr) + result.add quote do: + let color = + if `part`(`puzzleInput`) == `output`: fgGreen + else: fgRed + stdout.styledWriteLine(color, `msg`, fgDefault, ": ", $`output`) + +loadInputs() diff --git a/solutions/day04/solution.nim b/solutions/day04/solution.nim index 875d786..27b21ab 100644 --- a/solutions/day04/solution.nim +++ b/solutions/day04/solution.nim @@ -1,7 +1,6 @@ -import std/[math, sets, sequtils, strutils] +import std/[math, sets, sequtils, strutils, macros] -const example* = slurp("example.txt").strip() -const input* = slurp("input.txt").strip() +import ../aoc type Card = object @@ -44,12 +43,10 @@ proc partTwo*(input: string): int = return winners.sum() -when isMainModule: - import std/unittest - suite "day 4": - test "part one": - check partOne(example) == 13 - check partOne(input) == 22674 - test "part two": - check partTwo(example) == 30 - check partTwo(input) == 5747443 +solve: + example: + partOne: 13 + partTwo: 30 + input: + partOne: 22674 + partTwo: 5747443