Spaces:
Running
Running
def load_data(file): | |
with open(file) as f: | |
data = f.readlines() | |
positions = [] | |
velocities = [] | |
for line in data: | |
_, p, v = line.split("=") | |
p = [int(x.split()[0]) for x in p.split(",")] | |
v = [int(x) for x in v.split(",")] | |
positions.append(p) | |
velocities.append(v) | |
return positions, velocities | |
def move(n_seconds, pos, vel, W, H): | |
x, y = pos | |
vx, vy = vel | |
new_x = (x + vx * n_seconds) % W | |
new_y = (y + vy * n_seconds) % H | |
return (new_x, new_y) | |
def construct_grid(positions, W, H): | |
grid = [[0]*W for _ in range(H)] | |
for pos in positions: | |
x, y = pos | |
grid[y][x] += 1 | |
return grid | |
def pprint(grid): | |
import copy | |
grid_copy = copy.deepcopy(grid) | |
for y in range(H): | |
for x in range(W): | |
grid_copy[y][x] = str(grid_copy[y][x]) if grid_copy[y][x] != 0 else "." | |
grid_str = "\n".join(["".join(g) for g in grid_copy]) | |
print(grid_str) | |
def get_safety_factor(grid, H, W): | |
middle_x = W // 2 | |
middle_y = H // 2 | |
quadrants = [[0,0], [0,0]] | |
for y in range(H): | |
for x in range(W): | |
if x < middle_x and y < middle_y: | |
quadrants[0][0] += grid[y][x] | |
if x > middle_x and y < middle_y: | |
quadrants[1][0] += grid[y][x] | |
if x < middle_x and y > middle_y: | |
quadrants[0][1] += grid[y][x] | |
if x > middle_x and y > middle_y: | |
quadrants[1][1] += grid[y][x] | |
return quadrants[0][0] * quadrants[0][1] * quadrants[1][1] * quadrants[1][0] | |
pass | |
# Part one | |
file = "input.txt" | |
W, H = 101, 103 | |
positions, velocities = load_data(file) | |
n_seconds = 100 | |
new_positions = [] | |
for pos, vel in zip(positions, velocities): | |
new_pos = move(n_seconds, pos, vel, W=W, H=H) | |
new_positions.append(new_pos) | |
grid = construct_grid(new_positions, W=W, H=H) | |
print(get_safety_factor(grid, H=H, W=W)) | |
# Part two | |
import time | |
file = "input.txt" | |
W, H = 101, 103 | |
positions, velocities = load_data(file) | |
grid = construct_grid(positions, W=W, H=H) | |
row_0 = grid[0] | |
row_1 = grid[1] | |
row_2 = grid[2] | |
new_positions = [] | |
n_moves = 750+980+320+257+300+230+200+500+140+312+3297 | |
for pos, vel in zip(positions, velocities): | |
new_pos = move(n_moves, pos, vel, W=W, H=H) | |
new_positions.append(new_pos) | |
positions = new_positions | |
grid = construct_grid(positions, W=W, H=H) | |
# pprint(grid) | |
print(n_moves) | |
# A bunch of code that was used for debugging! | |
# grid = construct_grid(positions, W=W, H=H) | |
# new_positions = [] | |
# for pos, vel in zip(positions, velocities): | |
# new_pos = move(260+139+403+209+473, pos, vel, W=W, H=H) | |
# new_positions.append(new_pos) | |
# positions = new_positions | |
# row_tip = [0]*W | |
# # row_tip[50] = 1 | |
# | |
# n_seconds = 1 | |
# for N in range(n_seconds): | |
# new_positions = [] | |
# for pos, vel in zip(positions, velocities): | |
# new_pos = move(1, pos, vel, W=W, H=H) | |
# new_positions.append(new_pos) | |
# | |
# positions = new_positions | |
# | |
# grid = construct_grid(positions, W=W, H=H) | |
# | |
# if row_0 == grid[0] and row_1 == grid[1] and row_2 == grid[2]: | |
# print("Repeat!!!!???!?", N) | |
# break | |
# | |
# # if row_tip == grid[0]: | |
# # print() | |
# # print(N) | |
# # pprint(grid) | |
# # print() | |
# | |
# # if N % 100 == 0: | |
# # print(N) | |
# pprint(grid) | |
# print(N) | |
# print() | |
# print() | |
# time.sleep(0.001) | |
# print(get_safety_factor(grid, H=H, W=W)) | |