diff --git a/progress.png b/progress.png index 4dcc7f8..8f702e1 100644 Binary files a/progress.png and b/progress.png differ diff --git a/progress.yaml b/progress.yaml index 9ac4b5c..94895da 100644 --- a/progress.yaml +++ b/progress.yaml @@ -43,4 +43,6 @@ 22: stars: 1 23: - stars: 2 \ No newline at end of file + stars: 2 +24: + stars: 1 \ No newline at end of file diff --git a/res/examples/day24_1.txt b/res/examples/day24_1.txt new file mode 100644 index 0000000..de04a48 --- /dev/null +++ b/res/examples/day24_1.txt @@ -0,0 +1,10 @@ +x00: 1 +x01: 1 +x02: 1 +y00: 0 +y01: 1 +y02: 0 + +x00 AND y00 -> z00 +x01 XOR y01 -> z01 +x02 OR y02 -> z02 \ No newline at end of file diff --git a/res/examples/day24_2.txt b/res/examples/day24_2.txt new file mode 100644 index 0000000..09fb230 --- /dev/null +++ b/res/examples/day24_2.txt @@ -0,0 +1,47 @@ +x00: 1 +x01: 0 +x02: 1 +x03: 1 +x04: 0 +y00: 1 +y01: 1 +y02: 1 +y03: 1 +y04: 1 + +ntg XOR fgs -> mjb +y02 OR x01 -> tnw +kwq OR kpj -> z05 +x00 OR x03 -> fst +tgd XOR rvg -> z01 +vdt OR tnw -> bfw +bfw AND frj -> z10 +ffh OR nrd -> bqk +y00 AND y03 -> djm +y03 OR y00 -> psh +bqk OR frj -> z08 +tnw OR fst -> frj +gnj AND tgd -> z11 +bfw XOR mjb -> z00 +x03 OR x00 -> vdt +gnj AND wpb -> z02 +x04 AND y00 -> kjc +djm OR pbm -> qhw +nrd AND vdt -> hwm +kjc AND fst -> rvg +y04 OR y02 -> fgs +y01 AND x02 -> pbm +ntg OR kjc -> kwq +psh XOR fgs -> tgd +qhw XOR tgd -> z09 +pbm OR djm -> kpj +x03 XOR y03 -> ffh +x00 XOR y04 -> ntg +bfw OR bqk -> z06 +nrd XOR fgs -> wpb +frj XOR qhw -> z04 +bqk OR frj -> z07 +y03 OR x01 -> nrd +hwm AND bqk -> z03 +tgd XOR rvg -> z12 +tnw OR pbm -> gnj \ No newline at end of file diff --git a/src/day24/puzzle1.typ b/src/day24/puzzle1.typ new file mode 100644 index 0000000..686da49 --- /dev/null +++ b/src/day24/puzzle1.typ @@ -0,0 +1,78 @@ +#import "/src/utils.typ": * + +#let solve(input) = { + let (inputs, gates) = input.split("\n\n") + let ids = () + inputs = inputs.split("\n").map(i => { + let (id, value) = i.split(": ") + return (id: id, value: value == "1") + }) + ids += inputs.map(i => i.id) + gates = gates.split("\n").map(g => { + let (gate, output) = g.split(" -> ") + let (i1, op, i2) = gate.split(" ") + return ( + in1: i1, + in2: i2, + op: op, + out: output + ) + }) + let gates-by-id = (:) + for gate in gates { + gates-by-id.insert(gate.out, gate) + } + + ids += gates.map(g => g.out) + ids = ids.dedup() + let dbg = (inputs, gates) + + let values = (:) + for input in inputs { + values.insert(input.id, input.value) + } + + let stack = ids.filter(id => id.starts-with("z")) + let output = (0,) * stack.len() + while stack.len() != 0 { + let v = stack.pop() + if v in values { + if v.starts-with("z") { + let i = int(v.slice(1)) + output.at(i) = int(values.at(v)) + } + } else { + stack.push(v) + let gate = gates-by-id.at(v) + if gate.in1 in values and gate.in2 in values { + let v1 = values.at(gate.in1) + let v2 = values.at(gate.in2) + let value = if gate.op == "AND" { + v1 and v2 + } else if gate.op == "OR" { + v1 or v2 + } else if gate.op == "XOR" { + (v1 or v2) and not (v1 and v2) + } + values.insert(v, value) + } else { + stack.push(gate.in1) + stack.push(gate.in2) + } + } + } + + let result = output.rev() + .fold(0, (a, b) => a.bit-lshift(1).bit-or(b)) + + return result +} + +#show-puzzle( + 24, 1, + solve, + example: ( + "1": 4, + "2": 2024 + ) +) \ No newline at end of file diff --git a/src/day24/puzzle2.typ b/src/day24/puzzle2.typ new file mode 100644 index 0000000..e69de29 diff --git a/src/main.pdf b/src/main.pdf index fc1d30a..305c2df 100644 Binary files a/src/main.pdf and b/src/main.pdf differ