Advent of Code 2023 day 24
12/24/2024, 5:00 AMHCP
12/24/2024, 6:36 AMHCP
12/24/2024, 7:17 AMHCP
12/24/2024, 7:34 AMAlbert Chang
12/24/2024, 7:36 AMx00 XOR y00 -> z00
x00 AND y00 -> finalCarry
Every bit after 00:
x01 XOR y01 -> firstResult
x01 AND y01 -> firstCarry
firstResult XOR previousFinalCarry -> z01
firstResult AND previousFinalCarry -> secondCarry
firstCarry OR secondCarry -> finalCarry
I just printed out all the gates that don't match the pattern and found the swapped pairs manually.Dan Fingal-Surma
12/24/2024, 7:37 AMHCP
12/24/2024, 7:37 AMDan Fingal-Surma
12/24/2024, 7:37 AMDan Fingal-Surma
12/24/2024, 7:40 AMHCP
12/24/2024, 7:41 AMDan Fingal-Surma
12/24/2024, 7:41 AMHCP
12/24/2024, 7:41 AMDan Fingal-Surma
12/24/2024, 7:41 AMDan Fingal-Surma
12/24/2024, 7:42 AMDan Fingal-Surma
12/24/2024, 7:45 AMDan Fingal-Surma
12/24/2024, 8:07 AMJonathan Kolberg
12/24/2024, 8:14 AMDan Fingal-Surma
12/24/2024, 8:15 AMAlbert Chang
12/24/2024, 8:19 AMAlbert Chang
12/24/2024, 8:21 AMDan Fingal-Surma
12/24/2024, 8:22 AMWire(name=z18, input=AndGate(a=Wire(name=y18, input=InputGate(value=true)), b=Wire(name=x18, input=InputGate(value=true))))
Dan Fingal-Surma
12/24/2024, 8:23 AMDan Fingal-Surma
12/24/2024, 8:24 AMDan Fingal-Surma
12/24/2024, 8:24 AMDan Fingal-Surma
12/24/2024, 8:25 AMDan Fingal-Surma
12/24/2024, 8:32 AMbj0
12/24/2024, 8:55 AMbj0
12/24/2024, 8:56 AMbj0
12/24/2024, 8:56 AMDan Fingal-Surma
12/24/2024, 8:57 AMjava.lang.IllegalArgumentException: Swap z10 into sqr XOR mwq
Now we’re cookingDan Fingal-Surma
12/24/2024, 8:58 AMDan Fingal-Surma
12/24/2024, 8:58 AMDan Fingal-Surma
12/24/2024, 8:58 AMDan Fingal-Surma
12/24/2024, 9:00 AMjava.lang.IllegalArgumentException: Swap z18 into nqq XOR nfh
Dan Fingal-Surma
12/24/2024, 9:00 AMDan Fingal-Surma
12/24/2024, 9:05 AMjava.util.NoSuchElementException: Key ([hsw, mrs], XOR) is missing in the map.
when trying to look up the rule that would produce z24. So now I find the rule that does produce z24, which is
jmh XOR mrs -> z24
therefore hsw and jmh should be swapped i thinkDan Fingal-Surma
12/24/2024, 9:07 AMDan Fingal-Surma
12/24/2024, 9:08 AMjava.lang.IllegalArgumentException: Swap z33 into wwp XOR cvt
winnerDan Fingal-Surma
12/24/2024, 9:08 AMDan Fingal-Surma
12/24/2024, 9:11 AMDan Fingal-Surma
12/24/2024, 9:12 AMDan Fingal-Surma
12/24/2024, 9:13 AMdata class Rule
Dan Fingal-Surma
12/24/2024, 9:16 AMDan Fingal-Surma
12/24/2024, 9:26 AMx01 XOR y01 -> firstResult
x01 AND y01 -> firstCarry
firstResult XOR previousFinalCarry -> z01
firstResult AND previousFinalCarry -> secondCarry
firstCarry OR secondCarry -> finalCarry
the key thing here is consistency. If e.g. firstResult on line #1 does not have the same name as firstResult on line #3, the one on #3 wins (input wires can’t change) and you need to swap whatever line currently outputs to the wire from #3 (which necessarily hasn’t been seen in prior bits) with the wire from #1Dan Fingal-Surma
12/24/2024, 9:27 AMHCP
12/24/2024, 12:52 PMHCP
12/24/2024, 12:58 PMJonathan Kolberg
12/24/2024, 1:01 PMJan Durovec
12/24/2024, 1:30 PMphldavies
12/24/2024, 2:04 PMval r = xors.get(x, y).key
val ca = ands.get(x, y).key
xors.find(r)
.let { it ?: xors.find(ca)?.also { add(ca, r) } }
?.let { (out) -> if (out != z) add(out, z) }
which finds just the 4 swaps I needed - annoying as I don't have any other inputs to check againstphldavies
12/24/2024, 3:59 PMJonathan Kolberg
12/24/2024, 6:41 PMHCP
12/24/2024, 8:36 PMDan Fingal-Surma
12/24/2024, 8:53 PMDan Fingal-Surma
12/24/2024, 8:54 PMBad wires at 10 - z10 is not on XOR gate
Gate(input1=Wire(name=kgd, value=1), input2=Wire(name=kqf, value=0), output=Wire(name=z10, value=1), type=OR)
SwapGate(input1=Wire(name=mwq, value=1), input2=Wire(name=sqr, value=1), output=Wire(name=mwk, value=0), type=XOR)
Bad wires at 18 - z18 is not on XOR gate
Gate(input1=Wire(name=x18, value=1), input2=Wire(name=y18, value=1), output=Wire(name=z18, value=1), type=AND)
SwapGate(input1=Wire(name=nfh, value=0), input2=Wire(name=nqq, value=0), output=Wire(name=qgd, value=0), type=XOR)
Bad wires at 24 - x XOR y gate output is wrong
Gate(input1=Wire(name=x24, value=1), input2=Wire(name=y24, value=0), output=Wire(name=hsw, value=1), type=XOR)
SwapGate(input1=Wire(name=x24, value=1), input2=Wire(name=y24, value=0), output=Wire(name=jmh, value=0), type=AND)
Bad wires at 33 - z33 is not on XOR gate
Gate(input1=Wire(name=cvt, value=0), input2=Wire(name=wwp, value=0), output=Wire(name=z33, value=0), type=AND)
SwapGate(input1=Wire(name=cvt, value=0), input2=Wire(name=wwp, value=0), output=Wire(name=gqp, value=0), type=XOR)
gqp,hsw,jmh,mwk,qgd,z10,z18,z33
HCP
12/24/2024, 8:59 PMephemient
12/25/2024, 12:13 AMDan Fingal-Surma
12/25/2024, 12:37 AMDan Fingal-Surma
12/25/2024, 12:38 AMkingsley
12/25/2024, 8:04 AMCold:
Part1: ~4ms. Part2: ~2ms
Warm:
Part1: ~240us. Part2: ~280us
My approach for part 2 doesn't work for the sample input though as I use an assumption that every gate operation in the input maps to a distinct output (not sure if some people got inputs where this isn't the case). If anyone is up for it, I'd appreciate some help to run it against your inputs and let me know if it still works fineDan Fingal-Surma
12/25/2024, 8:18 AMDan Fingal-Surma
12/25/2024, 8:23 AMx01 XOR y01 -> firstResult
x01 AND y01 -> firstCarry
firstResult XOR previousFinalCarry -> z01
firstResult AND previousFinalCarry -> secondCarry
firstCarry OR secondCarry -> finalCarry
which is the right approachkingsley
12/25/2024, 8:23 AMx00 OR x03 = fst
x00 OR x03 = vdt
My part 2 doesn't work in such casekingsley
12/25/2024, 8:24 AMritesh
12/25/2024, 6:29 PMJakub Gwóźdź
12/29/2024, 5:56 PM