You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.7 KiB
Python
88 lines
1.7 KiB
Python
3 years ago
|
from time import sleep
|
||
|
|
||
|
with open("input") as f:
|
||
|
lights = [n.strip() for n in f.readlines()]
|
||
|
|
||
|
STEPS = 100
|
||
|
# STEPS = 5
|
||
|
|
||
|
X_MAX = len(lights)
|
||
|
Y_MAX = len(lights[0])
|
||
|
|
||
|
|
||
|
def print_lights():
|
||
|
for row in lights:
|
||
|
print(row)
|
||
|
|
||
|
|
||
|
def neighbors_that_are_on(center_x, center_y):
|
||
|
count = 0
|
||
|
for d_x in range(-1, 2):
|
||
|
for d_y in range(-1, 2):
|
||
|
x = center_x + d_x
|
||
|
y = center_y + d_y
|
||
|
if d_x == 0 and d_y == 0:
|
||
|
continue
|
||
|
if x < 0 or x >= X_MAX:
|
||
|
continue
|
||
|
if y < 0 or y >= Y_MAX:
|
||
|
continue
|
||
|
neighbor = lights[x][y]
|
||
|
if neighbor == "#":
|
||
|
count += 1
|
||
|
return count
|
||
|
|
||
|
|
||
|
def get_next_state(prev_state, neighbors_count):
|
||
|
if prev_state == "#":
|
||
|
if neighbors_count in [2, 3]:
|
||
|
return "#"
|
||
|
else:
|
||
|
return "."
|
||
|
else: # light == '.'
|
||
|
if neighbors_count == 3:
|
||
|
return "#"
|
||
|
else:
|
||
|
return "."
|
||
|
|
||
|
|
||
|
def turn_corners_on():
|
||
|
lights[0] = "#" + lights[0][1:-1] + "#"
|
||
|
lights[-1] = "#" + lights[-1][1:-1] + "#"
|
||
|
|
||
|
|
||
|
print("Initial state")
|
||
|
turn_corners_on()
|
||
|
print_lights()
|
||
|
print()
|
||
|
|
||
|
for step in range(STEPS):
|
||
|
new_lights = []
|
||
|
|
||
|
for x in range(X_MAX):
|
||
|
line = ""
|
||
|
for y in range(Y_MAX):
|
||
|
light = lights[x][y]
|
||
|
neighbors_count = neighbors_that_are_on(x, y)
|
||
|
next_state = get_next_state(light, neighbors_count)
|
||
|
line += next_state
|
||
|
new_lights.append(line)
|
||
|
|
||
|
lights = new_lights
|
||
|
turn_corners_on()
|
||
|
print("Step", step + 1)
|
||
|
print_lights()
|
||
|
print()
|
||
|
sleep(0.03)
|
||
|
|
||
|
|
||
|
count = 0
|
||
|
for line in lights:
|
||
|
for light in line:
|
||
|
if light == "#":
|
||
|
count += 1
|
||
|
|
||
|
print(count)
|
||
|
|
||
|
# 353: too low
|