Funny that original 2023 day 5 also was a PITA
to figure out.
Pt 1 was solved using BFS to flood-fill. After
trying some different methods for pt 2, including:
- wallcrawling,
- side couting,
- corner counting
I never produced code to get past the test cases.
- Wall crawling are hard due to overlapping
regions.
- corner couting and side counting are both hard,
but will act as equally good solutions (since side
count equals corner count).
- Concave corners are hard, convex corners are
easy.
The final code is based on the posts on the
solutions megathread. Changes:
- Keep all areas in a set, defining a region.
- find all convex and concave corners in each
region.
A new helper got introduced: Di, storing all
diagonal neighbors for grid traversing.
Convex corners:
.. R. .R ..
R. .. .. .R
Concave corners:
RR .R R. RR
.R RR RR R.
Initial version of the code tried to solve pt 1
using BFS, which took way too long even for the
test data.
After some fiddling with algebra with pen and paper,
I realized this 2 formulaes (using first example):
94 * b1 + 22 * b2 == 840
34 * b1 + 67 * b2 == 540
*b1 = button A presses
*b2 = button B presses
... could be rewritten to this single expression:
(94 + 34) * b1 + (22 + 67) * b2 = 840 * 540
I failed to remember the algebra for solving x than
y though, that I had to learn from the subreddit.
In the code, this is the ratio part.
Also, this solution using fractions is SICK.
https://www.reddit.com/r/adventofcode/comments/1hd4wda/comment/m1tz3nf/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
Loooong time overdue. First drafts of the code
kept track of every id separately in a defaultdict.
This was not sustainable since the code examples
had some recurring ids, and after managing to
support the test cases the code was eay off for
the real puzzle input.
In the end, the whole code was deleted and replaced
by a BFS solution that expands the current regions
until it finds no more areas.
Got the trick to count all perimiters in an else clause
from a leaderboard placed youtuber.