diff --git a/src/Year_2021/P11.py b/src/Year_2021/P11.py new file mode 100644 index 0000000..53b3ba1 --- /dev/null +++ b/src/Year_2021/P11.py @@ -0,0 +1,421 @@ +# --- Day 11: Dumbo Octopus --- + +# You enter a large cavern full of rare bioluminescent dumbo octopuses! They +# seem to not like the Christmas lights on your submarine, so you turn them off +# for now. + +# There are 100 octopuses arranged neatly in a 10 by 10 grid. Each octopus +# slowly gains energy over time and flashes brightly for a moment when its +# energy is full. Although your lights are off, maybe you could navigate +# through the cave without disturbing the octopuses if you could predict when +# the flashes of light will happen. + +# Each octopus has an energy level - your submarine can remotely measure the +# energy level of each octopus (your puzzle input). For example: + +# 5483143223 +# 2745854711 +# 5264556173 +# 6141336146 +# 6357385478 +# 4167524645 +# 2176841721 +# 6882881134 +# 4846848554 +# 5283751526 + +# The energy level of each octopus is a value between 0 and 9. Here, the +# top-left octopus has an energy level of 5, the bottom-right one has an energy +# level of 6, and so on. + +# You can model the energy levels and flashes of light in steps. During a +# single step, the following occurs: + +# First, the energy level of each octopus increases by 1. +# Then, any octopus with an energy level greater than 9 flashes. This +# increases the energy level of all adjacent octopuses by 1, including +# octopuses that are diagonally adjacent. If this causes an octopus to have an +# energy level greater than 9, it also flashes. This process continues as long +# as new octopuses keep having their energy level increased beyond 9. (An +# octopus can only flash at most once per step.) +# Finally, any octopus that flashed during this step has its energy level +# set to 0, as it used all of its energy to flash. + +# Adjacent flashes can cause an octopus to flash on a step even if it begins +# that step with very little energy. Consider the middle octopus with 1 energy +# in this situation: + +# Before any steps: +# 11111 +# 19991 +# 19191 +# 19991 +# 11111 + +# After step 1: +# 34543 +# 40004 +# 50005 +# 40004 +# 34543 + +# After step 2: +# 45654 +# 51115 +# 61116 +# 51115 +# 45654 + +# An octopus is highlighted when it flashed during the given step. + +# Here is how the larger example above progresses: + +# Before any steps: +# 5483143223 +# 2745854711 +# 5264556173 +# 6141336146 +# 6357385478 +# 4167524645 +# 2176841721 +# 6882881134 +# 4846848554 +# 5283751526 + +# After step 1: +# 6594254334 +# 3856965822 +# 6375667284 +# 7252447257 +# 7468496589 +# 5278635756 +# 3287952832 +# 7993992245 +# 5957959665 +# 6394862637 + +# After step 2: +# 8807476555 +# 5089087054 +# 8597889608 +# 8485769600 +# 8700908800 +# 6600088989 +# 6800005943 +# 0000007456 +# 9000000876 +# 8700006848 + +# After step 3: +# 0050900866 +# 8500800575 +# 9900000039 +# 9700000041 +# 9935080063 +# 7712300000 +# 7911250009 +# 2211130000 +# 0421125000 +# 0021119000 + +# After step 4: +# 2263031977 +# 0923031697 +# 0032221150 +# 0041111163 +# 0076191174 +# 0053411122 +# 0042361120 +# 5532241122 +# 1532247211 +# 1132230211 + +# After step 5: +# 4484144000 +# 2044144000 +# 2253333493 +# 1152333274 +# 1187303285 +# 1164633233 +# 1153472231 +# 6643352233 +# 2643358322 +# 2243341322 + +# After step 6: +# 5595255111 +# 3155255222 +# 3364444605 +# 2263444496 +# 2298414396 +# 2275744344 +# 2264583342 +# 7754463344 +# 3754469433 +# 3354452433 + +# After step 7: +# 6707366222 +# 4377366333 +# 4475555827 +# 3496655709 +# 3500625609 +# 3509955566 +# 3486694453 +# 8865585555 +# 4865580644 +# 4465574644 + +# After step 8: +# 7818477333 +# 5488477444 +# 5697666949 +# 4608766830 +# 4734946730 +# 4740097688 +# 6900007564 +# 0000009666 +# 8000004755 +# 6800007755 + +# After step 9: +# 9060000644 +# 7800000976 +# 6900000080 +# 5840000082 +# 5858000093 +# 6962400000 +# 8021250009 +# 2221130009 +# 9111128097 +# 7911119976 + +# After step 10: +# 0481112976 +# 0031112009 +# 0041112504 +# 0081111406 +# 0099111306 +# 0093511233 +# 0442361130 +# 5532252350 +# 0532250600 +# 0032240000 + +# After step 10, there have been a total of 204 flashes. Fast forwarding, here +# is the same configuration every 10 steps: + +# After step 20: +# 3936556452 +# 5686556806 +# 4496555690 +# 4448655580 +# 4456865570 +# 5680086577 +# 7000009896 +# 0000000344 +# 6000000364 +# 4600009543 + +# After step 30: +# 0643334118 +# 4253334611 +# 3374333458 +# 2225333337 +# 2229333338 +# 2276733333 +# 2754574565 +# 5544458511 +# 9444447111 +# 7944446119 + +# After step 40: +# 6211111981 +# 0421111119 +# 0042111115 +# 0003111115 +# 0003111116 +# 0065611111 +# 0532351111 +# 3322234597 +# 2222222976 +# 2222222762 + +# After step 50: +# 9655556447 +# 4865556805 +# 4486555690 +# 4458655580 +# 4574865570 +# 5700086566 +# 6000009887 +# 8000000533 +# 6800000633 +# 5680000538 + +# After step 60: +# 2533334200 +# 2743334640 +# 2264333458 +# 2225333337 +# 2225333338 +# 2287833333 +# 3854573455 +# 1854458611 +# 1175447111 +# 1115446111 + +# After step 70: +# 8211111164 +# 0421111166 +# 0042111114 +# 0004211115 +# 0000211116 +# 0065611111 +# 0532351111 +# 7322235117 +# 5722223475 +# 4572222754 + +# After step 80: +# 1755555697 +# 5965555609 +# 4486555680 +# 4458655580 +# 4570865570 +# 5700086566 +# 7000008666 +# 0000000990 +# 0000000800 +# 0000000000 + +# After step 90: +# 7433333522 +# 2643333522 +# 2264333458 +# 2226433337 +# 2222433338 +# 2287833333 +# 2854573333 +# 4854458333 +# 3387779333 +# 3333333333 + +# After step 100: +# 0397666866 +# 0749766918 +# 0053976933 +# 0004297822 +# 0004229892 +# 0053222877 +# 0532222966 +# 9322228966 +# 7922286866 +# 6789998766 + +# After 100 steps, there have been a total of 1656 flashes. + +# Given the starting energy levels of the dumbo octopuses in your cavern, +# simulate 100 steps. How many total flashes are there after 100 steps? + +from itertools import count, product + +with open("files/P11.txt") as f: + grid = { + (x, y): int(n) + for y, row in enumerate(f.readlines()) + for x, n in enumerate(row.strip()) + } + + +def increment(row: int, col: int, _set: set[tuple[int, int]]) -> int: + if (row, col) not in grid or (row, col) in _set: + return 0 + + grid[row, col] += 1 + + if grid[row, col] > 9: + grid[row, col] = 0 + _set.add((row, col)) + + return 1 + sum( + increment(row - row_delta, col - col_delta, _set) + for row_delta, col_delta in set(product((-1, 0, 1), repeat=2)) + - {(0, 0)} + ) + + return 0 + + +def part_1() -> None: + flashes = 0 + for _ in range(100): + flashed: set[tuple[int, int]] = set() + flashes += sum(increment(r, c, flashed) for r, c in grid) + + print(f"There are {flashes} flashes after 100 steps") + + +# --- Part Two --- + +# It seems like the individual flashes aren't bright enough to navigate. +# However, you might have a better option: the flashes seem to be +# synchronizing! + +# In the example above, the first time all octopuses flash simultaneously is +# step 195: + +# After step 193: +# 5877777777 +# 8877777777 +# 7777777777 +# 7777777777 +# 7777777777 +# 7777777777 +# 7777777777 +# 7777777777 +# 7777777777 +# 7777777777 + +# After step 194: +# 6988888888 +# 9988888888 +# 8888888888 +# 8888888888 +# 8888888888 +# 8888888888 +# 8888888888 +# 8888888888 +# 8888888888 +# 8888888888 + +# After step 195: +# 0000000000 +# 0000000000 +# 0000000000 +# 0000000000 +# 0000000000 +# 0000000000 +# 0000000000 +# 0000000000 +# 0000000000 +# 0000000000 + +# If you can calculate the exact moments when the octopuses will all flash +# simultaneously, you should be able to navigate through the cavern. What is +# the first step during which all octopuses flash? + + +def part_2() -> None: + for step in count(1): + flashed: set[tuple[int, int]] = set() + if sum(increment(row, col, flashed) for row, col in grid) == len(grid): + print( + f"All octopuses will flash simultaneously after {step} steps" + ) + break + + +if __name__ == "__main__": + part_1() + part_2()