1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class Hailstone:
def __init__(self, sx, sy, sz, vx, vy, vz):
self.sx = sx
self.sy = sy
self.sz = sz
self.vx = vx
self.vy = vy
self.vz = vz
self.a = vy
self.b = -vx
self.c = vy * sx - vx * sy
def __repr__(self):
return "Hailstone{" + f"a={self.a}, b={self.b}, c={self.c}" + "}"
hailstones = [Hailstone(*map(int, line.replace("@", ",").split(","))) for line in open("data/day24.txt")]
total = 0
for i, hs1 in enumerate(hailstones):
for hs2 in hailstones[:i]:
a1, b1, c1 = hs1.a, hs1.b, hs1.c
a2, b2, c2 = hs2.a, hs2.b, hs2.c
if a1 * b2 == b1 * a2:
continue
x = (c1 * b2 - c2 * b1) / (a1 * b2 - a2 * b1)
y = (c2 * a1 - c1 * a2) / (a1 * b2 - a2 * b1)
if 200000000000000 <= x <= 400000000000000 and 200000000000000 <= y <= 400000000000000:
if all((x - hs.sx) * hs.vx >= 0 and (y - hs.sy) * hs.vy >= 0 for hs in (hs1, hs2)):
total += 1
print(total)
|