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)
|