-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday16.part2.py
More file actions
62 lines (56 loc) · 2.76 KB
/
Copy pathday16.part2.py
File metadata and controls
62 lines (56 loc) · 2.76 KB
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
pyint = int
data = "220D4B80491FE6FBDCDA61F23F1D9B763004A7C128012F9DA88CE27B000B30F4804D49CD515380352100763DC5E8EC000844338B10B667A1E60094B7BE8D600ACE774DF39DD364979F67A9AC0D1802B2A41401354F6BF1DC0627B15EC5CCC01694F5BABFC00964E93C95CF080263F0046741A740A76B704300824926693274BE7CC880267D00464852484A5F74520005D65A1EAD2334A700BA4EA41256E4BBBD8DC0999FC3A97286C20164B4FF14A93FD2947494E683E752E49B2737DF7C4080181973496509A5B9A8D37B7C300434016920D9EAEF16AEC0A4AB7DF5B1C01C933B9AAF19E1818027A00A80021F1FA0E43400043E174638572B984B066401D3E802735A4A9ECE371789685AB3E0E800725333EFFBB4B8D131A9F39ED413A1720058F339EE32052D48EC4E5EC3A6006CC2B4BE6FF3F40017A0E4D522226009CA676A7600980021F1921446700042A23C368B713CC015E007324A38DF30BB30533D001200F3E7AC33A00A4F73149558E7B98A4AACC402660803D1EA1045C1006E2CC668EC200F4568A5104802B7D004A53819327531FE607E118803B260F371D02CAEA3486050004EE3006A1E463858600F46D8531E08010987B1BE251002013445345C600B4F67617400D14F61867B39AA38018F8C05E430163C6004980126005B801CC0417080106005000CB4002D7A801AA0062007BC0019608018A004A002B880057CEF5604016827238DFDCC8048B9AF135802400087C32893120401C8D90463E280513D62991EE5CA543A6B75892CB639D503004F00353100662FC498AA00084C6485B1D25044C0139975D004A5EB5E52AC7233294006867F9EE6BA2115E47D7867458401424E354B36CDAFCAB34CBC2008BF2F2BA5CC646E57D4C62E41279E7F37961ACC015B005A5EFF884CBDFF10F9BFF438C014A007D67AE0529DED3901D9CD50B5C0108B13BAFD6070"
def int(x, y = 10):
return pyint("".join(x), y)
k = list("".join(bin(int(c, 16))[2:].zfill(4) for c in data.strip()))
def parse(k):
version = int(k[:3], 2)
k[:] = k[3:]
typeid = int(k[:3], 2)
k[:] = k[3:]
if typeid == 4:
data = []
while True:
cont = k.pop(0)
data += k[:4]
k[:] = k[4:]
if cont == "0": break
data = int(data, 2)
return (version, typeid, data)
else:
packets = []
if k.pop(0) == "0":
length = int(k[:15], 2)
k[:] = k[15:]
d = k[:length]
k[:] = k[length:]
while d:
packets.append(parse(d))
else:
num = int(k[:11], 2)
k[:] = k[11:]
for _ in range(num):
packets.append(parse(k))
return (version, typeid, packets)
def vsum(k):
if k[1] == 0:
return sum(map(vsum, k[2]))
elif k[1] == 1:
t = 1
for q in k[2]:
t *= vsum(q)
return t
elif k[1] == 2:
return min(map(vsum, k[2]))
elif k[1] == 3:
return max(map(vsum, k[2]))
elif k[1] == 4:
return k[2]
elif k[1] == 5:
return vsum(k[2][0]) > vsum(k[2][1])
elif k[1] == 6:
return vsum(k[2][0]) < vsum(k[2][1])
elif k[1] == 7:
return vsum(k[2][0]) == vsum(k[2][1])
q = parse(k)
print(vsum(q))