standalone prettyprinter for solutions

This commit is contained in:
Daylin Morgan 2023-12-04 17:27:41 -06:00
parent e79043f336
commit 8255ac49d2
Signed by: daylin
GPG key ID: C1E52E7DD81DF79F
2 changed files with 45 additions and 12 deletions

36
solutions/aoc.nim Normal file
View file

@ -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()

View file

@ -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