day 16
This commit is contained in:
60
2021/16.py
Normal file
60
2021/16.py
Normal file
@@ -0,0 +1,60 @@
|
||||
with open('./2021/16.input') as input_file:
|
||||
input_data = input_file.read()
|
||||
ll = input_data
|
||||
|
||||
d = bin(int(ll, 16))[2:]
|
||||
while len(d) < 4 * len(ll):
|
||||
d = '0' + d
|
||||
|
||||
def peek(data, n):
|
||||
ret = data[0][:n]
|
||||
data[0] = data[0][n:]
|
||||
return ret
|
||||
|
||||
sumofversions = 0
|
||||
def parse(data):
|
||||
global sumofversions
|
||||
|
||||
version = int(peek(data, 3), 2)
|
||||
sumofversions += version
|
||||
|
||||
tid = int(peek(data, 3), 2)
|
||||
if tid == 4:
|
||||
t = []
|
||||
while True:
|
||||
cnt, *v = peek(data, 5)
|
||||
t += v
|
||||
if cnt == '0':
|
||||
break
|
||||
return int("".join(t), 2)
|
||||
|
||||
ltid = peek(data, 1)[0]
|
||||
spv = []
|
||||
if ltid == '0':
|
||||
subpacketslen = int(peek(data, 15), 2)
|
||||
subpackets = [peek(data, subpacketslen)]
|
||||
while subpackets[0]:
|
||||
spv.append(parse(subpackets))
|
||||
else:
|
||||
spv = [parse(data) for i in range(int(peek(data, 11), 2))]
|
||||
if tid == 0:
|
||||
return sum(spv)
|
||||
elif tid == 1:
|
||||
p = 1
|
||||
for x in spv:
|
||||
p *= x
|
||||
return p
|
||||
elif tid == 2:
|
||||
return min(spv)
|
||||
elif tid == 3:
|
||||
return max(spv)
|
||||
elif tid == 5:
|
||||
return int(spv[0] > spv[1])
|
||||
elif tid == 6:
|
||||
return int(spv[0] < spv[1])
|
||||
elif tid == 7:
|
||||
return int(spv[0] == spv[1])
|
||||
|
||||
p2 = parse([d])
|
||||
print(sumofversions)
|
||||
print(p2)
|
||||
Reference in New Issue
Block a user