From 03063514a55c7a8c026bc1612e6871a6bd41cfa3 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 7 Dec 2024 12:45:27 +0100 Subject: [PATCH] added visualization for day 7 puzzle 2 --- src/day7/puzzle2.typ | 139 ++++++++++++++++++++++++++++++++++++++++++- src/main.pdf | Bin 106803 -> 107434 bytes 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/src/day7/puzzle2.typ b/src/day7/puzzle2.typ index 0d07f82..906246f 100644 --- a/src/day7/puzzle2.typ +++ b/src/day7/puzzle2.typ @@ -1,4 +1,5 @@ #import "/src/utils.typ": * +#import "@preview/cetz:0.3.1": canvas, draw #let concat(a, b) = { return int(str(a) + str(b)) @@ -53,8 +54,144 @@ 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)) + } + } + let str-target = str(target) + let str-v = str(v) + if str-target == str-v { + return (false, ()) + } + if str-target.ends-with(str-v) { + let target2 = str-target.slice( + 0, + str-target.len() - str-v.len() + ) + let r = get-solution(values, int(target2)) + 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, + "||": sym.bar + sym.bar + ).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 + } else if op == "||" { + v = int(str(v) + str(v2)) + } + + lvl += 1 + } + }) + diags.push(diag) + } + + diags.last() = grid.cell( + colspan: 3 - calc.rem(diags.len() - 1, 3), + diags.last() + ) + + grid( + columns: 3, + stroke: (paint: black, dash: "dashed"), + align: center + horizon, + inset: 0.4em, + ..diags + ) +} + #show-puzzle( 7, 2, solve, - example: 11387 + example: 11387, + visualize: visualize ) \ No newline at end of file diff --git a/src/main.pdf b/src/main.pdf index 1132a16219ee7987dbcab91cc0a112a5affe7028..b341142388473381259aa70d044c3907ff51a725 100644 GIT binary patch delta 12592 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 auXtFxdw9Fs+EF7RjL=AGetreb^Zx@a%b%?P delta 11981 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