mirror of
https://github.com/cupcakearmy/advent-of-code.git
synced 2025-01-08 15:56:25 +00:00
11
This commit is contained in:
parent
a580157718
commit
44b8ac589a
11
2021/11/README.md
Normal file
11
2021/11/README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# 11
|
||||||
|
|
||||||
|
Description
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Solutions</summary>
|
||||||
|
<ol>
|
||||||
|
<li>1749</li>
|
||||||
|
<li>285</li>
|
||||||
|
</ol>
|
||||||
|
</details>
|
125
2021/11/python/main.py
Normal file
125
2021/11/python/main.py
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
from os.path import dirname, join
|
||||||
|
|
||||||
|
# Day 11
|
||||||
|
|
||||||
|
# Common
|
||||||
|
|
||||||
|
|
||||||
|
def read_input(filename):
|
||||||
|
data = join(dirname(__file__), '..', filename)
|
||||||
|
with open(data) as f:
|
||||||
|
return f.read().strip()
|
||||||
|
|
||||||
|
|
||||||
|
test = read_input('test.txt')
|
||||||
|
data = read_input('input.txt')
|
||||||
|
|
||||||
|
|
||||||
|
def bold(text: str) -> str:
|
||||||
|
return f'\033[1m{text}\033[0m'
|
||||||
|
|
||||||
|
|
||||||
|
def red(text: str) -> str:
|
||||||
|
return f'\033[31m{text}\033[0m'
|
||||||
|
|
||||||
|
|
||||||
|
class OctoGrid:
|
||||||
|
|
||||||
|
def __init__(self, grid: list[list[int]]) -> None:
|
||||||
|
self.grid = grid
|
||||||
|
self.flashed = set()
|
||||||
|
self.x = len(grid[0])
|
||||||
|
self.y = len(grid)
|
||||||
|
|
||||||
|
def _flash(self, x: int, y: int):
|
||||||
|
if (x, y) in self.flashed:
|
||||||
|
return False
|
||||||
|
self.flashed.add((x, y))
|
||||||
|
# print(f"Flash at {y}, {x}")
|
||||||
|
for dx in range(-1, 2):
|
||||||
|
for dy in range(-1, 2):
|
||||||
|
# if dx == dy == 0:
|
||||||
|
# continue
|
||||||
|
target_x = x + dx
|
||||||
|
target_y = y + dy
|
||||||
|
if 0 <= target_x < self.x and 0 <= target_y < self.y:
|
||||||
|
self.grid[target_y][target_x] += 1
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _check(self):
|
||||||
|
for y in range(self.y):
|
||||||
|
for x in range(self.x):
|
||||||
|
if self.grid[y][x] > 9:
|
||||||
|
if self._flash(x, y):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _step(self):
|
||||||
|
self.flashed.clear()
|
||||||
|
|
||||||
|
# Increase all by one
|
||||||
|
for y in range(self.y):
|
||||||
|
for x in range(self.x):
|
||||||
|
self.grid[y][x] += 1
|
||||||
|
|
||||||
|
while self._check():
|
||||||
|
pass
|
||||||
|
|
||||||
|
for y in range(self.y):
|
||||||
|
for x in range(self.x):
|
||||||
|
if self.grid[y][x] > 9:
|
||||||
|
self.grid[y][x] = 0
|
||||||
|
|
||||||
|
return len(self.flashed)
|
||||||
|
|
||||||
|
def count_flashes(self, steps):
|
||||||
|
total = 0
|
||||||
|
for _ in range(steps):
|
||||||
|
total += self._step()
|
||||||
|
return total
|
||||||
|
|
||||||
|
def first_simultaneous(self):
|
||||||
|
step = 0
|
||||||
|
while True:
|
||||||
|
step += 1
|
||||||
|
if self._step() == self.y * self.x:
|
||||||
|
return step
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
def f(x):
|
||||||
|
s = str(x).ljust(3, ' ')
|
||||||
|
if x > 9:
|
||||||
|
s = bold(red(s))
|
||||||
|
return s
|
||||||
|
s = ''
|
||||||
|
for y in range(self.y):
|
||||||
|
s += ''.join(f(x) for x in self.grid[y]) + '\n'
|
||||||
|
return s
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def parse(data):
|
||||||
|
grid = [
|
||||||
|
list(map(int, line))
|
||||||
|
for line
|
||||||
|
in data.splitlines()
|
||||||
|
]
|
||||||
|
return OctoGrid(grid)
|
||||||
|
|
||||||
|
|
||||||
|
# 1
|
||||||
|
print('1.')
|
||||||
|
|
||||||
|
grid = OctoGrid.parse(test)
|
||||||
|
print(grid.count_flashes(100))
|
||||||
|
grid = OctoGrid.parse(test)
|
||||||
|
print(grid.first_simultaneous())
|
||||||
|
|
||||||
|
# 2
|
||||||
|
print('\n2.')
|
||||||
|
|
||||||
|
grid = OctoGrid.parse(data)
|
||||||
|
print(grid.count_flashes(100))
|
||||||
|
grid = OctoGrid.parse(data)
|
||||||
|
print(grid.first_simultaneous())
|
Loading…
Reference in New Issue
Block a user