From 52a253c1ea31e8eeccb3e2348794ec585c847735 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 7 Dec 2024 12:38:19 +0100 Subject: [PATCH] added visualization for day 7 puzzle 1 --- src/day7/puzzle1.typ | 120 ++++++++++++++++++++++++++++++++++++++++++- src/main.pdf | Bin 105199 -> 106803 bytes 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/src/day7/puzzle1.typ b/src/day7/puzzle1.typ index 6e7898c..a6771fd 100644 --- a/src/day7/puzzle1.typ +++ b/src/day7/puzzle1.typ @@ -1,4 +1,5 @@ #import "/src/utils.typ": * +#import "@preview/cetz:0.3.1": canvas, draw #let solveable(values, target) = { if values.len() == 1 { @@ -35,8 +36,125 @@ return total } +#let visualize(input) = { + let get-solution(values, target) = { + if values.len() == 1 { + return (values.last() == target, (target,)) + } + + let values = values + let v = values.pop() + if calc.rem(target, v) == 0 { + let r = get-solution(values, target / v) + if r.first() { + return (true, r.last() + ("*", v)) + } + } + if v > target { + return (false, ()) + } + + let r = get-solution(values, target - v) + if r.first() { + return (true, r.last() + ("+", v)) + } + return (false, ()) + } + let num(v, x, y, name) = { + draw.circle( + (x, y), + radius: 0.4, + fill: gray.lighten(60%), + name: name + ) + draw.content((x, y), str(v)) + } + let ope(o, x, y, name) = { + let s = ( + "+": sym.plus, + "*": sym.times + ).at(o) + draw.circle( + (x, y), + radius: 0.3, + fill: orange.lighten(60%), + name: name + ) + draw.content((x, y), s) + } + + let equations = input.split("\n") + let diags = () + for equation in equations { + let (target, values) = equation.split(": ") + target = int(target) + values = values.split(" ").map(int) + + let r = get-solution(values, target) + if not r.first() { + continue + } + let diag = canvas({ + let lvl = 0 + let steps = r.last() + let prev = none + let v = steps.remove(0) + + while true { + num(v, lvl, -lvl, str(lvl) + "-0") + + if lvl != 0 { + draw.line( + str(lvl - 1) + "-1", + str(lvl) + "-0" + ) + } + + if steps.len() == 0 { + break + } + + let op = steps.remove(0) + let v2 = steps.remove(0) + + ope(op, lvl + 1, -lvl, str(lvl) + "-1") + num(v2, lvl + 2, -lvl, str(lvl) + "-2") + draw.line( + str(lvl) + "-0", + str(lvl) + "-1" + ) + draw.line( + str(lvl) + "-2", + str(lvl) + "-1" + ) + if op == "+" { + v += v2 + } else if op == "*" { + v *= v2 + } + + lvl += 1 + } + }) + diags.push(diag) + } + + if calc.rem(diags.len(), 2) == 1 { + diags.last() = grid.cell(colspan: 2, diags.last()) + } + + grid( + columns: 2, + stroke: (paint: black, dash: "dashed"), + align: center + horizon, + inset: 0.4em, + ..diags + ) +} + #show-puzzle( 7, 1, solve, - example: 3749 + example: 3749, + visualize: visualize ) \ No newline at end of file diff --git a/src/main.pdf b/src/main.pdf index 35c1dade50e386736c78800131bd26117548fb22..1132a16219ee7987dbcab91cc0a112a5affe7028 100644 GIT binary patch delta 12194 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 delta 10485 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 MMdy%|+-acsf3V+^T>t<8