89 lines
1.6 KiB
Python
89 lines
1.6 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
|
||
|
import functools
|
||
|
import re
|
||
|
import sys
|
||
|
|
||
|
input_file = sys.argv[1]
|
||
|
|
||
|
with open(input_file) as fd:
|
||
|
lines = [line.rstrip() for line in fd.readlines()]
|
||
|
|
||
|
vec = tuple[int, int]
|
||
|
poss: list[vec] = list()
|
||
|
vits: list[vec] = list()
|
||
|
|
||
|
for line in lines:
|
||
|
match = re.findall(r"(-?\d+)", line)
|
||
|
assert match
|
||
|
pos = int(match[0]), int(match[1])
|
||
|
vit = int(match[2]), int(match[3])
|
||
|
poss.append(pos)
|
||
|
vits.append(vit)
|
||
|
|
||
|
print(poss, vits)
|
||
|
|
||
|
|
||
|
def print_poss(poss: list[vec]) -> None:
|
||
|
viz = [[0] * width for _ in range(height)]
|
||
|
for pos in poss:
|
||
|
px, py = pos
|
||
|
viz[py][px] += 1
|
||
|
for line in viz:
|
||
|
print("".join([(str(c) if c > 0 else ".") for c in line]))
|
||
|
print()
|
||
|
|
||
|
|
||
|
# x→ y↓
|
||
|
if input_file == "input":
|
||
|
width = 101
|
||
|
height = 103
|
||
|
else:
|
||
|
width = 11
|
||
|
height = 7
|
||
|
if input_file == "demo1":
|
||
|
secs = 5
|
||
|
else:
|
||
|
secs = 100
|
||
|
|
||
|
print_poss(poss)
|
||
|
|
||
|
for s in range(secs):
|
||
|
for r, vit in enumerate(vits):
|
||
|
px, py = poss[r]
|
||
|
px += vit[0]
|
||
|
py += vit[1]
|
||
|
while px >= width:
|
||
|
px -= width
|
||
|
while py >= height:
|
||
|
py -= height
|
||
|
while px < 0:
|
||
|
px += width
|
||
|
while py < 0:
|
||
|
py += height
|
||
|
poss[r] = px, py
|
||
|
print(s)
|
||
|
print_poss(poss)
|
||
|
|
||
|
|
||
|
half_width = width // 2
|
||
|
half_height = height // 2
|
||
|
# <<<<<|>>>>>
|
||
|
# <= first quadrant
|
||
|
|
||
|
quadrants = [0, 0, 0, 0]
|
||
|
for pos in poss:
|
||
|
px, py = pos
|
||
|
q = 0
|
||
|
if px == half_width or py == half_height:
|
||
|
continue
|
||
|
if px > half_width:
|
||
|
q += 1
|
||
|
if py > half_height:
|
||
|
q += 2
|
||
|
quadrants[q] += 1
|
||
|
|
||
|
print(quadrants)
|
||
|
print(functools.reduce(int.__mul__, quadrants))
|