Skip to content

Commit ad94338

Browse files
committed
day 24 part 2 - brute force, basically
1 parent f77677f commit ad94338

File tree

4 files changed

+367
-79
lines changed

4 files changed

+367
-79
lines changed

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,37 @@ transformations. I think it's pretty readable and easy to understand what's happ
161161

162162
I'm running out of steam, so when I get around to it, I'm going to cheat for days 17 and 24 and see how someone
163163
else solved them. Implementation is still helpful for learning!
164+
165+
### 1/14/2025
166+
167+
Warning: spoilers for day 24 part 2 below.
168+
169+
I read some reddit posts to help me solve this one. Many of them suggested visualizing the graph of wires
170+
to better grasp what's happening, so I output a [graphviz](https://graphviz.org/) dot file and stared at it for a
171+
while.
172+
173+
It gave me the idea to build a list of dependencies of the incorrect z wires, and filter out any wires that contributed
174+
to correct z wires: this would reduce the swap candidates to just a handful of wires that I could viably test by trying
175+
every possible combination of 4 swaps. This was misguided, however, since a "correct" z wire is dependent on the inputs,
176+
and the solution has to work with ANY values in the x and y wires. Even using randomized x and y values to figure out
177+
likely dependents eliminated too many candidates.
178+
179+
So I gave up solving it on my own, and dove more deeply into the reddit discussions. Most of them focus on
180+
understanding the ["full adder"](https://en.wikipedia.org/wiki/Adder_(electronics)#Full_adder): the puzzle input
181+
basically constructs one of these (except for the 4 swapped gates, of course). Interestingly, many people solved this
182+
puzzle without code: they did it using pen and paper, and/or by inspecting a visual graph by eye and noticing how it
183+
"obviously" deviated from the composition of gates for a full adder. But this wasn't obvious to me. I could see the
184+
general shape of the graph and the places where it seemed off, but beyond that, it gave me a headache to try to
185+
identify what the configuration of the full adder should look like for each z wire.
186+
187+
I ended up implementing [a solution by someone](https://www.reddit.com/r/adventofcode/comments/1hneuf0/comment/m41ms44/)
188+
who used a brute force approach I thought was pretty clever: set up a bunch of test devices with randomized x and y
189+
values, find a swap that results in the most improvement for all of them, and repeat until you find the set of 4 swaps
190+
that works for every test device. After adding caching to the evaluation of wire values, my solution ran in only 35s
191+
(the author reported it taking 2.5 mins on their machine). More details are in the code.
192+
193+
I suppose slogging through it was worth the insight into how mathematical addition works at the level of logical gates
194+
(you need a carry bit!), even if I didn't use that knowledge for the actual solution.
195+
196+
Anyway, day 17 part 2 is the last remaining puzzle for me. Like day 24, it involves implementing a computer. Ugh,
197+
I dislike these types of problems so much.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy