day 15 part 2 alternate solution
parent
2b0ef33a08
commit
7b40516b66
|
@ -0,0 +1,35 @@
|
||||||
|
import pyclipper # https://pypi.org/project/pyclipper/
|
||||||
|
|
||||||
|
data = []
|
||||||
|
for line in open("input"):
|
||||||
|
words = line.replace(":", "").replace(",","").split()
|
||||||
|
coords = [int(w[w.index('=')+1:]) for w in words if '=' in w]
|
||||||
|
data.append(coords)
|
||||||
|
|
||||||
|
|
||||||
|
pc = pyclipper.Pyclipper()
|
||||||
|
for sx,sy,bx,by in data:
|
||||||
|
dx = abs(sx-bx)
|
||||||
|
dy = abs(sy-by)
|
||||||
|
d = dx+dy
|
||||||
|
pc.AddPath([(sx+d,sy),(sx,sy+d),(sx-d,sy),(sx,sy-d)], pyclipper.PT_CLIP, closed=True)
|
||||||
|
|
||||||
|
M = 4000000
|
||||||
|
pc.AddPath([(0,0),(M,0),(M,M),(0,M)], pyclipper.PT_SUBJECT, closed=True)
|
||||||
|
|
||||||
|
solution = pc.Execute(pyclipper.CT_DIFFERENCE, pyclipper.PFT_NONZERO, pyclipper.PFT_NONZERO)
|
||||||
|
|
||||||
|
# should return a single small polygon shaped like a diamond
|
||||||
|
# the answer we want is the point at the center of the diamond
|
||||||
|
|
||||||
|
assert len(solution) == 1
|
||||||
|
assert pyclipper.Area(solution[0]) < 4
|
||||||
|
|
||||||
|
def avg(ns):
|
||||||
|
return sum(ns)/len(ns)
|
||||||
|
|
||||||
|
for p in solution:
|
||||||
|
x = avg([x for x,y in p])
|
||||||
|
y = avg([y for x,y in p])
|
||||||
|
print(x,y)
|
||||||
|
print("frequency =",M*x + y)
|
Loading…
Reference in New Issue