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.
Felt paranoid on this one, was expecting something
much worse for pt2.
The code that solved the puzzle was _extremely_
naive:
- It asumes puzzle input only contains mul() with
1-3 chars. The versioned code have `{1,3}` as safe
guard.
- p2 asumed initial chunk does not begin with
"n't". Would have been easy to handle though.
- p2 asumed junk strings as "don", "do", "don()t"
would not exist.
In other words, I was really lucky since I did not
look that closely on puzzle input beforehand.
Might have cut 60-90 seconds further if I had just
ran pt2 immidately instead of staring dumbly on the
test data (that changed for pt2).
Also, I got reminded that \d in regular expressions
is equal to `0-9`: it does not include commas and
punctations. The code that solved the puzzle was
paranoid and instead used `0-9`.
Managed to score ~1500th somehow despite this.