From b1a59d3cf581498e535510291fdd71afe02c134f Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 2 Dec 2024 08:00:46 +0100 Subject: [PATCH] added visualization + minor fixes --- src/day1/puzzle1.typ | 2 +- src/day1/puzzle2.typ | 54 +++++++++++++++++++++++++++++++++++++++++-- src/main.pdf | Bin 24448 -> 31799 bytes src/utils.typ | 40 ++++++++++++++++++++++++-------- 4 files changed, 84 insertions(+), 12 deletions(-) diff --git a/src/day1/puzzle1.typ b/src/day1/puzzle1.typ index 008842f..a92f547 100644 --- a/src/day1/puzzle1.typ +++ b/src/day1/puzzle1.typ @@ -15,7 +15,7 @@ } #show-puzzle( - 1, + 1, 1, solve, example: 11 ) \ No newline at end of file diff --git a/src/day1/puzzle2.typ b/src/day1/puzzle2.typ index fcde641..8c0936a 100644 --- a/src/day1/puzzle2.typ +++ b/src/day1/puzzle2.typ @@ -1,4 +1,5 @@ #import "/src/utils.typ": * +#import "@preview/cetz:0.3.1": canvas, draw #let solve(input) = { let lines = input.split("\n") @@ -29,8 +30,57 @@ return total } +#let visualize(input) = { + let lines = input.split("\n") + let (l1, l2) = ((), ()) + let reg = regex("^(\d+)\s+(\d+)$") + for line in lines { + let digits = line.match(reg) + l1.push(digits.captures.first()) + l2.push(digits.captures.last()) + } + + let unique = l1.dedup() + let colors = (red,green) + canvas({ + for (i, n) in l1.enumerate() { + let y = -0.9 * i + draw.circle( + (0, y), + radius: 0.35, + stroke: black, + name: "l" + str(i) + ) + draw.content((0, y), n) + } + for (i, n) in l2.enumerate() { + let y = -0.9 * i + draw.circle( + (4, y), + radius: 0.35, + stroke: black, + name: "r" + str(i) + ) + draw.content((4, y), n) + } + for (i, a) in l1.enumerate() { + for (j, b) in l2.enumerate() { + if a == b { + draw.line( + "l" + str(i), + "r" + str(j), + stroke: colors.at(unique.position(n => n == a)) + 1.5pt, + mark: (end: "straight") + ) + } + } + } + }) +} + #show-puzzle( - 1, + 1, 2, solve, - example: 31 + example: 31, + visualize: visualize ) \ No newline at end of file diff --git a/src/main.pdf b/src/main.pdf index 2f9ca5146613ec8f1eaf872c82c8914e487ab027..090bee2c65bbaa8925a37aed60cfb991b96201d3 100644 GIT binary patch delta 15905 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 T-u4c}5Fi)@BIe>!&{F(ARyct4 delta 9996 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 diff --git a/src/utils.typ b/src/utils.typ index 86d36dd..cc435f0 100644 --- a/src/utils.typ +++ b/src/utils.typ @@ -1,5 +1,7 @@ #let star-state = state("stars", (:)) +#let star = text(font: "Twitter Color Emoji", emoji.star) + #let get-input-path(day) = { return "/res/inputs/day" + str(day) + ".txt" } @@ -13,8 +15,15 @@ return read(get-input-path(day)) } -#let check-example(day, func, target-result, suffix: none) = { - let result = (func)(read(get-example-path(day, suffix: suffix))) +#let check-example( + day, + func, + target-result, + suffix: none, + visualize: none +) = { + let input = read(get-example-path(day, suffix: suffix)) + let result = (func)(input) let passes = (result == target-result) let name = if suffix == none [Example] else [Example '#suffix'] let badge = box( @@ -38,6 +47,14 @@ } [#badge #h(0.6em)] + + if visualize != none { + linebreak() + figure( + visualize(input), + caption: [#name (visualization)] + ) + } } #let show-result(result) = { @@ -46,30 +63,35 @@ radius: 1.2em, baseline: 35%, fill: blue.lighten(20%), - text(fill: white)[Result: #result] + text(fill: white)[Result: #raw(repr(result))] ) } -#let show-puzzle(puzzle, func, example: none) = { +#let show-puzzle(day, puzzle, func, example: none, visualize: none) = { + let check-example = check-example.with(visualize: visualize) if example != none { if type(example) == dictionary { for (suffix, result) in example.pairs() { - check-example(puzzle, func, result, suffix: suffix) + check-example(day, func, result, suffix: suffix) } } else { - check-example(puzzle, func, example) + check-example(day, func, example) } linebreak() } - let input = get-input(1) + let input = get-input(day) let result = (func)(input) show-result(result) } #let day-template(day, puzzle1, puzzle2, stars: 0) = { pagebreak(weak: true) - let title = [Day #day] + ((emoji.star,)*stars).join() + let title = [Day #day] + box( + baseline: -1pt, + ((star,)*stars).join() + ) + [ = #title #label("day-" + str(day)) @@ -108,7 +130,7 @@ dir: ttb, spacing: 0.2em, cell, - h(3pt) + ((emoji.star,)* stars.at(str(i))).join() + ((star,)* stars.at(str(i))).join() ) if links { cell = link(label("day-" + str(i)), cell)