56 lines
1.0 KiB
Python
56 lines
1.0 KiB
Python
#!/usr/bin/env python
|
|
|
|
import copy
|
|
|
|
def decode_packet(packet):
|
|
|
|
# import pdb; pdb.set_trace()
|
|
|
|
result = 0
|
|
# get version
|
|
v = int(packet[:3], 2)
|
|
packet = packet[3:]
|
|
result += v
|
|
|
|
# get type
|
|
t = int(packet[:3], 2)
|
|
packet = packet[3:]
|
|
|
|
# literal, no other sub packets
|
|
if t == 4:
|
|
while True:
|
|
l = packet[:5]
|
|
packet = packet[5:]
|
|
if int(l[0],2) == 0:
|
|
break
|
|
return (result, packet)
|
|
|
|
i = int(packet[:1], 2)
|
|
packet = packet[1:]
|
|
if i == 0:
|
|
l = int(packet[:15], 2)
|
|
packet = packet[15:]
|
|
n_packet = packet[:l]
|
|
packet = packet[l:]
|
|
while (len(n_packet)):
|
|
(tmp_r, tmp_p) = decode_packet(n_packet)
|
|
n_packet = tmp_p
|
|
result += tmp_r
|
|
return(result, packet)
|
|
|
|
if i == 1:
|
|
l = int(packet[:11], 2)
|
|
packet = packet[11:]
|
|
for i in range(l):
|
|
(tmp_r, tmp_p) = decode_packet(packet)
|
|
packet = tmp_p
|
|
result += tmp_r
|
|
return (result, packet)
|
|
|
|
return (result, packet)
|
|
|
|
with open("input01.txt","r") as f:
|
|
for packet in f:
|
|
packet = bin(int('1'+packet.strip(), 16))[3:]
|
|
(result, packet) = decode_packet(packet)
|
|
print(result) |