day 24 puzzle 1

This commit is contained in:
Louis Heredero 2024-12-25 18:41:08 +01:00
parent ec75800078
commit 9300d786f8
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
7 changed files with 138 additions and 1 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 135 KiB

View File

@ -43,4 +43,6 @@
22:
stars: 1
23:
stars: 2
stars: 2
24:
stars: 1

10
res/examples/day24_1.txt Normal file
View File

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

47
res/examples/day24_2.txt Normal file
View File

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

78
src/day24/puzzle1.typ Normal file
View File

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

0
src/day24/puzzle2.typ Normal file
View File

Binary file not shown.