Gobbel2000

joined 2 years ago
[โ€“] [email protected] 6 points 2 years ago

Rust

The trick for part 2 is obviously to check when the pattern repeats itself and then jump ahead to 1000000000.

My code allocates an entire new grid for every tilt, some in-place procedure would probably be more efficient in terms of memory, but this seems good enough.

[โ€“] [email protected] 4 points 2 years ago

Rust

Part 2 turned out easier than I thought initially. My code assumes that there is only 1 mirror in each field which means I don't have to remember where the smudge is, I just have to find a mirror line where the two halves differ at exactly one spot.

[โ€“] [email protected] 3 points 2 years ago (1 children)

I don't think there are many significant optimizations with regards to reducing the search tree. It took me long enough to get behind it, but the "solution" (not saying there aren't other ways) to part 2 is to not calculate anything more than once. Instead put partial solutions in a dict indexed by the current state and use that cached value if you need it again.

It seems like you are actually constructing all rows with replaced ?. This won't be viable for part 2, your memory usage will explode. I have a recursive function that calls itself twice whenever a ? is encountered, once assuming it's a ., and once a #.

[โ€“] [email protected] 4 points 2 years ago

Rust

Took me way too long, but I'm happy with my solution now. I spent probably half an hour looking at my naive backtracking program churning away unsuccessfully before I thought of dynamic programming, meaning caching all intermediate results in a hashtable under their current state. The state is just the index into the spring array and the index into the range array, meaning there really can't be too many different entries. Doing so worked very well, solving part 2 in 4ms.

Adding the caching required me to switch from a loop to a recursive function, which turned out way easier. Why did no one tell me to just go recursive from the start?

[โ€“] [email protected] 10 points 2 years ago (1 children)

Yeah, not gonna do that.

[โ€“] [email protected] 3 points 2 years ago

Rust

I was unsure in Part 1 whether to actually expand the grid or just count the number of empty lanes in each ranges. I ended up doing the latter which was obviously the right choice for part 2, but I think it could have gone either way.

[โ€“] [email protected] 2 points 2 years ago

Rust

This one was tricky but interesting. In part 2 I basically did Breadth-First-Search starting at S to find all spots within the ring. The trick for me was to move between fields, meaning each position is at the corner of four fields. I never cross the pipe ring, and if I hit the area bounds I know I started outside the ring not inside and start over at a different corner of S.

Part 2 runs in 4ms.

[โ€“] [email protected] 4 points 2 years ago

Rust

Discrete derivatives!

[โ€“] [email protected] 1 points 2 years ago

I kind of agree, props for getting a general solution. I actually realized this issue only after I got both stars and didn't feel like changing it again.

[โ€“] [email protected] 4 points 2 years ago (11 children)

Rust

As others have shown, part 2 can be pretty simple if you allow one assumption: The distance from a start point to the nearest end point is always the same as cycling from that nearest end point back to itself. Under that assumption you can just take the lowest common multiple of these distances. And honestly, who can claim to understand ghost navigation and what you can and can't assume? Empirical evidence suggests that this is how ghosts travel.

[โ€“] [email protected] 138 points 2 years ago (7 children)

Rust:

Cannot move princess out of castle which is behind a shared reference

[โ€“] [email protected] 69 points 2 years ago (1 children)

Governments trying to ban end-to-end encryption be like:

view more: โ€น prev next โ€บ