day 15 ; three attempts for part 2, only the last fits in CPU and RAM. big up for Codon for accelerating python
This commit is contained in:
parent
efc1f11758
commit
673ad56fd0
|
@ -0,0 +1,40 @@
|
|||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
S = set()
|
||||
B = set()
|
||||
P = dict()
|
||||
Q = defaultdict(list)
|
||||
|
||||
for l in sys.stdin.read().splitlines():
|
||||
(_,_,X,Y,_,_,_,_,A,J) = l.split(" ")
|
||||
x = int(X[2:-1])
|
||||
y = int(Y[2:-1])
|
||||
a = int(A[2:-1])
|
||||
b = int(J[2:])
|
||||
S.add((x,y))
|
||||
B.add((a,b))
|
||||
P[(x,y)] = (a,b)
|
||||
Q[(a,b)].append((x,y))
|
||||
|
||||
if False:
|
||||
print("digraph G {")
|
||||
print("overlap = false;")
|
||||
def toid(x):
|
||||
(x,y) = x
|
||||
return str(x).replace("-","m")+"_"+str(y).replace("-","m")
|
||||
for (k,v) in P.items():
|
||||
print("S_"+toid(k), "->", "B_"+toid(v),";")
|
||||
print('}')
|
||||
|
||||
if True:
|
||||
print("digraph G {")
|
||||
print("overlap = false;")
|
||||
def toid(x):
|
||||
(x,y) = x
|
||||
return str(x).replace("-","m")+"_"+str(y).replace("-","m")
|
||||
for (k,V) in Q.items():
|
||||
for v in V:
|
||||
print("B_"+toid(k), "->", "C_"+toid(v),";")
|
||||
print('}')
|
|
@ -0,0 +1,52 @@
|
|||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
BX = 1765036
|
||||
BY = 2000000
|
||||
|
||||
def mtn(P,Q):
|
||||
(x,y) = P
|
||||
(u,v) = Q
|
||||
return abs(u-x)+abs(v-y)
|
||||
|
||||
S = set()
|
||||
B = set()
|
||||
P = dict()
|
||||
Q = defaultdict(list)
|
||||
|
||||
for l in sys.stdin.read().splitlines():
|
||||
(_,_,X,Y,_,_,_,_,A,J) = l.split(" ")
|
||||
x = int(X[2:-1])
|
||||
y = int(Y[2:-1])
|
||||
a = int(A[2:-1])
|
||||
b = int(J[2:])
|
||||
S.add((x,y))
|
||||
B.add((a,b))
|
||||
P[(x,y)] = (a,b)
|
||||
Q[(a,b)].append((x,y))
|
||||
|
||||
if len(S) < 20:
|
||||
BX = 2
|
||||
BY = 10
|
||||
|
||||
|
||||
Xs = set()
|
||||
for s in S:
|
||||
(x,y) = s
|
||||
sB = P[s] # nearest bc
|
||||
dB = mtn(s,sB) # max range before first bc
|
||||
dy = abs(y-BY) # to reach THE bc
|
||||
r = dB - dy
|
||||
if len(S) < 20:
|
||||
print(s, sB, (BX,BY), dB, dy, r)
|
||||
if r > 0:
|
||||
for d in range(-r,r+1):
|
||||
nx = x+d
|
||||
if abs(nx-BX)>=0:
|
||||
Xs.add(nx)
|
||||
|
||||
print(len(Xs)-1)
|
||||
|
||||
if len(S) < 20:
|
||||
print(Xs)
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
W = H = 4*1000*1000+1
|
||||
|
||||
def mtn(P,Q):
|
||||
(x,y) = P
|
||||
(u,v) = Q
|
||||
return abs(u-x)+abs(v-y)
|
||||
|
||||
P = dict()
|
||||
|
||||
for l in sys.stdin.read().splitlines():
|
||||
(_,_,X,Y,_,_,_,_,A,J) = l.split(" ")
|
||||
x = int(X[2:-1]) #+ 2
|
||||
y = int(Y[2:-1])
|
||||
a = int(A[2:-1]) #+ 2
|
||||
b = int(J[2:])
|
||||
P[(x,y)] = (a,b)
|
||||
|
||||
if len(P) < 20:
|
||||
print("S -> B", P)
|
||||
|
||||
|
||||
if len(P) < 20:
|
||||
W = H = 30
|
||||
|
||||
M = [ [1 for _ in range(W) ] for _ in range(H) ]
|
||||
|
||||
|
||||
for s,sB in P.items():
|
||||
(x,y) = s
|
||||
dB = mtn(s,sB) # max range before first bc
|
||||
if len(P) < 20:
|
||||
print(s, sB, dB)
|
||||
for rx in range(dB+1):
|
||||
for ry in range(dB-rx+1):
|
||||
for (nx,ny) in [(x-rx,y-ry),(x-rx,y+ry),(x+rx,y-ry),(x+rx,y+ry)]:
|
||||
if nx>=0 and nx<W and ny>=0 and ny<H:
|
||||
M[ny][nx] = 0
|
||||
|
||||
for y,r in enumerate(M):
|
||||
for x,c in enumerate(r):
|
||||
if c == 0:
|
||||
if len(P)>20:
|
||||
print(x,y)
|
||||
pass
|
||||
|
||||
if len(P) < 20:
|
||||
print("\n".join(" ".join(str(i) for i in l) for l in M))
|
||||
|
||||
# take too much memory
|
|
@ -0,0 +1,37 @@
|
|||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
def mtn(P,Q):
|
||||
(x,y) = P
|
||||
(u,v) = Q
|
||||
return abs(u-x)+abs(v-y)
|
||||
|
||||
S = list()
|
||||
for l in sys.stdin.read().splitlines():
|
||||
(_,_,X,Y,_,_,_,_,A,J) = l.split(" ")
|
||||
x = int(X[2:-1])
|
||||
y = int(Y[2:-1])
|
||||
a = int(A[2:-1])
|
||||
b = int(J[2:])
|
||||
S.append((x,y,abs(x-a)+abs(y-b)))
|
||||
|
||||
print(S)
|
||||
|
||||
W = H = 4*1000*1000 #+1
|
||||
if len(sys.argv)>1:
|
||||
W = H = 20+1
|
||||
|
||||
for i in range(W):
|
||||
print(".", end ='')
|
||||
for j in range(H):
|
||||
# is this point reachable by any sensor
|
||||
r = False
|
||||
for (x,y,db) in S:
|
||||
dp = abs(x-i)+abs(y-j)
|
||||
if dp <= db:
|
||||
r = True
|
||||
break
|
||||
if not r:
|
||||
print(i,j)
|
||||
|
||||
# taking too long
|
|
@ -0,0 +1,39 @@
|
|||
import sys
|
||||
|
||||
W = H = 4_000_000
|
||||
if len(sys.argv)>1: # sample
|
||||
W = H = 20
|
||||
|
||||
# store position that are not reachable, row by row
|
||||
L = [ [(0,0) for _ in range(32)] for _ in range(H+1) ]
|
||||
|
||||
|
||||
for i,l in enumerate(sys.stdin.read().splitlines()):
|
||||
(_,_,X,Y,_,_,_,_,A,J) = l.split(" ")
|
||||
x = int(X[2:-1])
|
||||
y = int(Y[2:-1])
|
||||
a = int(A[2:-1])
|
||||
b = int(J[2:])
|
||||
d = abs(x-a)+abs(y-b)
|
||||
for ny in range(y-d, y+d+1):
|
||||
if ny>=0 and ny<=H:
|
||||
dy = abs(ny-y)
|
||||
dx = d-dy
|
||||
L[ny][i] = (x-dx,x+dx)
|
||||
#L[ny] = intesec(L[ny], (x-dy,x+dy))
|
||||
|
||||
|
||||
if len(sys.argv)>1: # sample
|
||||
for l in L:
|
||||
print(l)
|
||||
|
||||
d=0
|
||||
for (y,I) in enumerate(L):
|
||||
SI = sorted(I)
|
||||
maxx = 0
|
||||
for (a,b) in SI:
|
||||
if a>maxx+1:
|
||||
d+=1
|
||||
print(y, maxx+1, (maxx+1)*4_000_000+y)
|
||||
maxx = max(maxx,b)
|
||||
print(d) # should be 1
|
Loading…
Reference in New Issue