# --- Day 25: Sea Cucumber --- # # This is it: the bottom of the ocean trench, the last place the # sleigh keys could be. Your submarine's experimental antenna still # isn't boosted enough to detect the keys, but they must be here. All # you need to do is reach the seafloor and find them. # # At least, you'd touch down on the seafloor if you could; # unfortunately, it's completely covered by two large herds of sea # cucumbers, and there isn't an open space large enough for your # submarine. # # You suspect that the Elves must have done this before, because just # then you discover the phone number of a deep-sea marine biologist on # a handwritten note taped to the wall of the submarine's cockpit. # # "Sea cucumbers? Yeah, they're probably hunting for food. But don't # worry, they're predictable critters: they move in perfectly straight # lines, only moving forward when there's space to do so. They're # actually quite polite!" # # You explain that you'd like to predict when you could land your # submarine. # # "Oh that's easy, they'll eventually pile up and leave enough space # for-- wait, did you say submarine? And the only place with that # many sea cucumbers would be at the very bottom of the Mariana--" # You hang up the phone. # # There are two herds of sea cucumbers sharing the same region; one # always moves east (>), while the other always moves south (v). Each # location can contain at most one sea cucumber; the remaining # locations are empty (.). The submarine helpfully generates a map of # the situation (your puzzle input). For example: # # v...>>.vv> # .vv>>.vv.. # >>.>v>...v # >>v>>.>.v. # v>v.vv.v.. # >.>>..v... # .vv..>.>v. # v.v..>>v.v # ....v..v.> # # Every step, the sea cucumbers in the east-facing herd attempt to # move forward one location, then the sea cucumbers in the # south-facing herd attempt to move forward one location. When a herd # moves forward, every sea cucumber in the herd first simultaneously # considers whether there is a sea cucumber in the adjacent location # it's facing (even another sea cucumber facing the same direction), # and then every sea cucumber facing an empty location simultaneously # moves into that location. # # So, in a situation like this: # # ...>>>>>... # # After one step, only the rightmost sea cucumber would have moved: # # ...>>>>.>.. # # After the next step, two sea cucumbers move: # # ...>>>.>.>. # # During a single step, the east-facing herd moves first, then the # south-facing herd moves. So, given this situation: # # .......... # .>v....v.. # .......>.. # .......... # # After a single step, of the sea cucumbers on the left, only the # south-facing sea cucumber has moved (as it wasn't out of the way in # time for the east-facing cucumber on the left to move), but both sea # cucumbers on the right have moved (as the east-facing sea cucumber # moved out of the way of the south-facing sea cucumber): # # .......... # .>........ # ..v....v>. # .......... # # Due to strong water currents in the area, sea cucumbers that move # off the right edge of the map appear on the left edge, and sea # cucumbers that move off the bottom edge of the map appear on the top # edge. Sea cucumbers always check whether their destination location # is empty before moving, even if that destination is on the opposite # side of the map: # # Initial state: # ...>... # ....... # ......> # v.....> # ......> # ....... # ..vvv.. # # After 1 step: # ..vv>.. # ....... # >...... # v.....> # >...... # ....... # ....v.. # # After 2 steps: # ....v>. # ..vv... # .>..... # ......> # v>..... # ....... # ....... # # After 3 steps: # ......> # ..v.v.. # ..>v... # >...... # ..>.... # v...... # ....... # # After 4 steps: # >...... # ..v.... # ..>.v.. # .>.v... # ...>... # ....... # v...... # # To find a safe place to land your submarine, the sea cucumbers need # to stop moving. Again consider the first example: # # Initial state: # v...>>.vv> # .vv>>.vv.. # >>.>v>...v # >>v>>.>.v. # v>v.vv.v.. # >.>>..v... # .vv..>.>v. # v.v..>>v.v # ....v..v.> # # After 1 step: # ....>.>v.> # v.v>.>v.v. # >v>>..>v.. # >>v>v>.>.v # .>v.v...v. # v>>.>vvv.. # ..v...>>.. # vv...>>vv. # >.v.v..v.v # # After 2 steps: # >.v.v>>..v # v.v.>>vv.. # >v>.>.>.v. # >>v>v.>v>. # .>..v....v # .>v>>.v.v. # v....v>v>. # .vv..>>v.. # v>.....vv. # # After 3 steps: # v>v.v>.>v. # v...>>.v.v # >vv>.>v>.. # >>v>v.>.v> # ..>....v.. # .>.>v>v..v # ..v..v>vv> # v.v..>>v.. # .v>....v.. # # After 4 steps: # v>..v.>>.. # v.v.>.>.v. # >vv.>>.v>v # >>.>..v>.> # ..v>v...v. # ..>>.>vv.. # >.v.vv>v.v # .....>>vv. # vvv>...v.. # # After 5 steps: # vv>...>v>. # v.v.v>.>v. # >.v.>.>.>v # >v>.>..v>> # ..v>v.v... # ..>.>>vvv. # .>...v>v.. # ..v.v>>v.v # v.v.>...v. # # ... # # After 10 steps: # ..>..>>vv. # v.....>>.v # ..v.v>>>v> # v>.>v.>>>. # ..v>v.vv.v # .v.>>>.v.. # v.v..>v>.. # ..v...>v.> # .vv..v>vv. # # ... # # After 20 steps: # v>.....>>. # >vv>.....v # .>v>v.vv>> # v>>>v.>v.> # ....vv>v.. # .v.>>>vvv. # ..v..>>vv. # v.v...>>.v # ..v.....v> # # ... # # After 30 steps: # .vv.v..>>> # v>...v...> # >.v>.>vv.> # >v>.>.>v.> # .>..v.vv.. # ..v>..>>v. # ....v>..>v # v.v...>vv> # v.v...>vvv # # ... # # After 40 steps: # >>v>v..v.. # ..>>v..vv. # ..>>>v.>.v # ..>>>>vvv> # v.....>... # v.v...>v>> # >vv.....v> # .>v...v.>v # vvv.v..v.> # # ... # # After 50 steps: # ..>>v>vv.v # ..v.>>vv.. # v.>>v>>v.. # ..>>>>>vv. # vvv....>vv # ..v....>>> # v>.......> # .vv>....v> # .>v.vv.v.. # # ... # # After 55 steps: # ..>>v>vv.. # ..v.>>vv.. # ..>>v>>vv. # ..>>>>>vv. # v......>vv # v>v....>>v # vvv...>..> # >vv.....>. # .>v.vv.v.. # # After 56 steps: # ..>>v>vv.. # ..v.>>vv.. # ..>>v>>vv. # ..>>>>>vv. # v......>vv # v>v....>>v # vvv....>.> # >vv......> # .>v.vv.v.. # # After 57 steps: # ..>>v>vv.. # ..v.>>vv.. # ..>>v>>vv. # ..>>>>>vv. # v......>vv # v>v....>>v # vvv.....>> # >vv......> # .>v.vv.v.. # # After 58 steps: # ..>>v>vv.. # ..v.>>vv.. # ..>>v>>vv. # ..>>>>>vv. # v......>vv # v>v....>>v # vvv.....>> # >vv......> # .>v.vv.v.. # # In this example, the sea cucumbers stop moving after 58 steps. # # Find somewhere safe to land your submarine. What is the first step # on which no sea cucumbers move? from common import lfilter from itertools import takewhile, count grid = [list(l.strip()) for l in open("25.in")] R, C = len(grid), len(grid[0]) # grid dimensions def step(): n = 0 for r in range(R): for c in lfilter( lambda c: grid[r][c] == ">" and grid[r][(c+1)%C] == ".", range(C) ): grid[r][c] = "." grid[r][(c+1)%C] = ">" n += 1 for c in range(C): for r in lfilter( lambda r: grid[r][c] == "v" and grid[(r+1)%R][c] == ".", range(R) ): grid[r][c] = "." grid[(r+1)%R][c] = "v" n += 1 return n print(list(takewhile(lambda _: step() > 0, count(1)))[-1] + 1) # --- Part Two --- # # Suddenly, the experimental antenna control console lights up: # # Sleigh keys detected! # # According to the console, the keys are directly under the submarine. # You landed right on them! Using a robotic arm on the submarine, you # move the sleigh keys into the airlock. # # Now, you just need to get them to Santa in time to save Christmas! # You check your clock - it is Christmas. There's no way you can get # them back to the surface in time. # # Just as you start to lose hope, you notice a button on the sleigh # keys: remote start. You can start the sleigh from the bottom of the # ocean! You just need some way to boost the signal from the keys so # it actually reaches the sleigh. Good thing the submarine has that # experimental antenna! You'll definitely need 50 stars to boost it # that far, though. # # The experimental antenna control console lights up again: # # Energy source detected. # Integrating energy source from device "sleigh keys"...done. # Installing device drivers...done. # Recalibrating experimental antenna...done. # Boost strength due to matching signal phase: 1 star # # Only 49 stars to go. print("DONE!")