/ Python / 2018 / 10.py
10.py
 1  from lib import *
 2  
 3  input = read_input(2018, 10)
 4  
 5  
 6  points = []
 7  for line in input.splitlines():
 8      x, y, vx, vy = map(int, re.match(r"^position=< *(-?\d+), *(-?\d+)> velocity=< *(-?\d+), *(-?\d+)>$", line).groups())
 9      points.append((x, y, vx, vy))
10  
11  i = 0
12  best = 1e1337
13  prev = None
14  while True:
15      p = {}
16      minx = miny = 1e1337
17      maxx = maxy = -1e1337
18      for x, y, vx, vy in points:
19          x += vx * i
20          y += vy * i
21          minx = min(x, minx)
22          maxx = max(x, maxx)
23          miny = min(y, miny)
24          maxy = max(y, maxy)
25          p[(x, y)] = True
26      dist = maxx - minx + maxy - miny
27  
28      if dist < best:
29          best = dist
30          i += 1
31          prev = p
32      else:
33          for y in range(miny, maxy + 1):
34              print("".join(" #"[prev.get((x, y), False)] for x in range(minx, maxx + 1)))
35          break
36  
37  
38  points = []
39  for line in input.splitlines():
40      x, y, vx, vy = map(int, re.match(r"^position=< *(-?\d+), *(-?\d+)> velocity=< *(-?\d+), *(-?\d+)>$", line).groups())
41      points.append((x, y, vx, vy))
42  
43  i = 0
44  best = 1e1337
45  prev = None
46  while True:
47      p = {}
48      minx = miny = 1e1337
49      maxx = maxy = -1e1337
50      for x, y, vx, vy in points:
51          x += vx * i
52          y += vy * i
53          minx = min(x, minx)
54          maxx = max(x, maxx)
55          miny = min(y, miny)
56          maxy = max(y, maxy)
57          p[(x, y)] = True
58      dist = maxx - minx + maxy - miny
59  
60      if dist < best:
61          best = dist
62          i += 1
63          prev = p
64      else:
65          print(i - 1)
66          break