@@ -30,55 +30,55 @@ def handle_value(type, value, new_value):
30
30
31
31
32
32
def parse_next_packet (bits ):
33
- version = bits [0 :3 ]
34
- type = bits [3 :6 ]
35
- version = int (version , 2 )
36
- type = int (type , 2 )
33
+ type = int (bits [3 :6 ], 2 )
37
34
value = None
38
35
39
36
if type == 4 :
40
37
literal = ""
41
38
offset = 6
42
39
while True :
43
40
is_last = int (bits [offset :offset + 1 ]) == 0
44
- val = bits [offset + 1 :offset + 5 ]
45
- literal += val
41
+ literal += bits [offset + 1 :offset + 5 ]
46
42
offset += 5
47
43
if is_last :
48
44
value = int (literal , 2 )
49
45
break
50
46
L = offset
51
47
else :
52
- I = int (bits [6 :7 ])
53
- if I :
48
+ length_type = int (bits [6 :7 ])
49
+ if length_type :
54
50
num_subpackets = int (bits [7 :18 ], 2 )
55
51
L = 18
52
+ sub_bits = bits [L :]
56
53
for _ in range (num_subpackets ):
57
- _ , new_L , v = parse_next_packet (bits [ L :] )
58
- value = handle_value (type , value , v )
54
+ new_L , new_value = parse_next_packet (sub_bits )
55
+ value = handle_value (type , value , new_value )
59
56
L += new_L
57
+ sub_bits = bits [L :]
60
58
else :
61
59
subpacket_length = int (bits [7 :22 ], 2 )
62
60
L = 22 + subpacket_length
63
61
sub_bits = bits [22 :L ]
64
62
while len (sub_bits ):
65
- sub_bits , _ , v = parse_next_packet (sub_bits )
66
- value = handle_value (type , value , v )
63
+ new_L , new_value = parse_next_packet (sub_bits )
64
+ value = handle_value (type , value , new_value )
65
+ sub_bits = sub_bits [new_L :]
67
66
68
- return bits [ L :], L , value
67
+ return L , value
69
68
70
69
71
70
def solve (line ):
72
71
bin_length = len (line )* 4
73
72
spec = '{fill}{align}{width}{type}' .format (fill = '0' , align = '>' , width = bin_length , type = 'b' )
74
73
hex = int (line , 16 )
75
- bits = format (hex , spec )
76
- val = None
74
+ remaining_bits = format (hex , spec )
75
+ value = None
77
76
78
- while len (bits ) > 7 :
79
- bits , L , val = parse_next_packet (bits )
77
+ while len (remaining_bits ) > 7 :
78
+ L , value = parse_next_packet (remaining_bits )
79
+ remaining_bits = remaining_bits [L :]
80
80
81
- return val
81
+ return value
82
82
83
83
84
84
if __name__ == "__main__" :
0 commit comments