Day 16
This commit is contained in:
48
day16/shared.py
Normal file
48
day16/shared.py
Normal file
@@ -0,0 +1,48 @@
|
||||
def bin_to_int(bin_num):
|
||||
return int(bin_num, 2)
|
||||
|
||||
|
||||
def parse_literal(bin_num):
|
||||
res = ""
|
||||
i = 0
|
||||
while True:
|
||||
res += bin_num[i+1:i+5]
|
||||
i += 5
|
||||
if bin_num[i-5] == '0':
|
||||
break
|
||||
return bin_to_int(res), i
|
||||
|
||||
|
||||
def parse_op(bin_num):
|
||||
if bin_num[0] == '0':
|
||||
length = bin_to_int(bin_num[1:16])
|
||||
return parse_packets(bin_num[16:16+length]), length+16
|
||||
else:
|
||||
amount = bin_to_int(bin_num[1:12])
|
||||
pkgs = []
|
||||
i = 0
|
||||
for _ in range(amount):
|
||||
pkg, length = parse_packet(bin_num[12+i:])
|
||||
pkgs.append(pkg)
|
||||
i += length
|
||||
return pkgs, 12+i
|
||||
|
||||
|
||||
def parse_packet(bin_num):
|
||||
ver = bin_to_int(bin_num[:3])
|
||||
op = bin_to_int(bin_num[3:6])
|
||||
if op == 4:
|
||||
value, length = parse_literal(bin_num[6:])
|
||||
else:
|
||||
value, length = parse_op(bin_num[6:])
|
||||
return (ver, op, value), length + 6
|
||||
|
||||
|
||||
def parse_packets(bin_num):
|
||||
pkgs = []
|
||||
i = 0
|
||||
while '1' in bin_num[i:]:
|
||||
pkg, length = parse_packet(bin_num[i:])
|
||||
pkgs.append(pkg)
|
||||
i += length
|
||||
return pkgs
|
||||
Reference in New Issue
Block a user