this post was submitted on 18 Dec 2024
5 points (77.8% liked)
Advent Of Code
920 readers
25 users here now
An unofficial home for the advent of code community on programming.dev!
Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.
AoC 2024
Solution Threads
M | T | W | T | F | S | S |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 |
Rules/Guidelines
- Follow the programming.dev instance rules
- Keep all content related to advent of code in some way
- If what youre posting relates to a day, put in brackets the year and then day number in front of the post title (e.g. [2024 Day 10])
- When an event is running, keep solutions in the solution megathread to avoid the community getting spammed with posts
Relevant Communities
Relevant Links
Credits
Icon base by Lorc under CC BY 3.0 with modifications to add a gradient
console.log('Hello World')
founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
I think I saw the same! At first I thought it requires pathfinding to see what nodes are connected to the wall, but then someone pointed at disjoint sets and just a glance at Wikipedia made it click right away. What an ingeniously simple but useful data structure! Maybe I'll reimplement my solution with that - mostly as an exercise for disjoint sets and finding a convenient representation for that in C.
That would be cool af to see in C, let me know if you do. In python, we can built the two sets, and have the convenient function call of
set( [iterate-able object/list/set] ).intersection( [iterate-able object/list/set] )
to see if the two sets touches/intersects as the block that connects the two sets would be in both sets/lists.The way I would build the two sets would be to start at the final state with all blocks placed and just union-find all the blocks. When we find that a block appears in both sets, then we stop the union and proceed with the other unions until we find all the blocks that would appear in both sets. then we iteratively find the first block that would appear in both sets. In python the intersection call returns a set, so you can stack the intersect call. like so:
set( [top right union set] ).intersection( [bottom left union set] ).intersection( [ one item list with the current block we are checking ] )
technically you can just save the intersections of the first two sets to save a little time because they would not change.I didn't think of this until recently, but I also think it is such a simple and elegant solution. Live and learn! ๐
hope you are having a good holiday season!