78 lines
1.5 KiB
Python
78 lines
1.5 KiB
Python
|
import numpy
|
||
|
import fileinput
|
||
|
import re
|
||
|
|
||
|
class Star:
|
||
|
def __init__(self, sx, sy, vx, vy):
|
||
|
self.sx = sx
|
||
|
self.sy = sy
|
||
|
self.vx = vx
|
||
|
self.vy = vy
|
||
|
|
||
|
def __str__(self):
|
||
|
return f"pos: ({self.sx:>2d}, {self.sy:>2d}), vel: ({self.vx:>2d}, {self.vy:>2d})"
|
||
|
|
||
|
def step(self):
|
||
|
self.sx += self.vx
|
||
|
self.sy += self.vy
|
||
|
|
||
|
def step_back(self):
|
||
|
self.sx -= self.vx
|
||
|
self.sy -= self.vy
|
||
|
|
||
|
last_stars = []
|
||
|
stars = []
|
||
|
|
||
|
sxs = []
|
||
|
sys = []
|
||
|
vxs = []
|
||
|
vys = []
|
||
|
count = 0
|
||
|
|
||
|
RE = re.compile("^position=< ?([\d\-]+), ?([\d\-]+)> velocity=< ?([\d\-]+), ?([\d\-]+)>$")
|
||
|
for line in fileinput.input():
|
||
|
match = RE.match(line)
|
||
|
sxs.append(int(match.group(1)))
|
||
|
sys.append(int(match.group(2)))
|
||
|
vxs.append(int(match.group(3)))
|
||
|
vys.append(int(match.group(4)))
|
||
|
count += 1
|
||
|
|
||
|
sxs = numpy.array(sxs)
|
||
|
sys = numpy.array(sys)
|
||
|
vxs = numpy.array(vxs)
|
||
|
vys = numpy.array(vys)
|
||
|
|
||
|
last_dy = 10000000000
|
||
|
steps = 0
|
||
|
while True:
|
||
|
# get the min-y and max-y
|
||
|
min_y = sys.min()
|
||
|
delta_y = sys.max() - min_y
|
||
|
|
||
|
if delta_y > last_dy:
|
||
|
sxs -= vxs
|
||
|
sys -= vys
|
||
|
|
||
|
min_x = sxs.min()
|
||
|
delta_x = sxs.max() - min_x
|
||
|
|
||
|
grid = numpy.zeros((delta_y + 1, delta_x + 1))
|
||
|
grid[sys - min_y, sxs - min_x] = 1
|
||
|
|
||
|
for y in range(delta_y + 1):
|
||
|
for x in range(delta_x + 1):
|
||
|
print('#' if grid[y][x] else '.', end='')
|
||
|
|
||
|
print()
|
||
|
|
||
|
print(steps - 1)
|
||
|
break
|
||
|
|
||
|
last_dy = delta_y
|
||
|
|
||
|
sxs += vxs
|
||
|
sys += vys
|
||
|
|
||
|
steps += 1
|