57 lines
1.4 KiB
Python
57 lines
1.4 KiB
Python
import sys
|
|
|
|
en=enumerate
|
|
|
|
def r2v(a,l):
|
|
return (a, a+l-1)
|
|
|
|
def v2r(a,b):
|
|
return (a, b-a+1)
|
|
|
|
def intersec(A:tuple, B:tuple) -> list(tuple):
|
|
a0, l = A
|
|
b0, m = B
|
|
a1 = r2v(A)[1]
|
|
b1 = r2v(B)[1]
|
|
if b1 < a0 or a1 < b0: # B outside
|
|
return A
|
|
if a0 < b0 and b1 < a1:
|
|
return [v2r(a0,b0-1),B,(b1+1,a1)]
|
|
if a0 == b0 and b1 < a1:
|
|
return [B,(b1+1,a1)]
|
|
|
|
if a0 < b0 and b1 < a1:
|
|
return [v2r(a0,b0-1),B,(b1+1,a1)]
|
|
if a0 < b0 and b1 < a1:
|
|
return [v2r(a0,b0-1),B,(b1+1,a1)]
|
|
if a0 < b0 and b1 < a1:
|
|
return [v2r(a0,b0-1),B,(b1+1,a1)]
|
|
|
|
if b0 <= a1 <= b1:
|
|
return (b0, a1-b0+1)
|
|
elif a1 > b1:
|
|
return B
|
|
return None
|
|
|
|
if __name__ == '__main__':
|
|
L = open(0).read().split('\n\n')
|
|
L = [l.split(':') for l in L]
|
|
L = [l[1].strip().split('\n') for l in L]
|
|
L = [list(map(lambda x: tuple(map(int,x.split())),l)) for l in L]
|
|
S = list(v for s in L[0] for v in s)
|
|
S = list(zip(S[0::2],S[1::2])) # list of range (start, length)
|
|
|
|
for i,l in en(L[1:]): # for each transformation
|
|
print(i, l)
|
|
R = []
|
|
for s in S: # transform each seed range
|
|
ns = None # new range
|
|
for dst, src, rg in l:
|
|
if src <= s < src+rg:
|
|
ns = dst+(s-src)
|
|
break
|
|
R.append(ns if ns else s)
|
|
S = R
|
|
print(S)
|
|
print(min(S))
|