Skip to content

Commit 2d017eb

Browse files
author
Joe Webster
committed
Adding day 16 part 1
1 parent 431e22a commit 2d017eb

3 files changed

Lines changed: 135 additions & 0 deletions

File tree

16/__init__.py

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
class BITSPacketDecoder(object):
2+
def __init__(self, packet):
3+
self.packet = packet
4+
self.bits = self.hex2bin(self.packet)
5+
self.index = 0
6+
7+
def hex2bin(self, hex_string):
8+
ret = ''
9+
for c in hex_string:
10+
ret += bin(int(c, 16))[2:].rjust(4, '0')
11+
12+
return ret
13+
14+
def bits_left(self):
15+
ret = len(self.bits) - self.index
16+
return ret
17+
18+
def read(self, read_len):
19+
if self.bits_left() < read_len:
20+
print("read underrun")
21+
return None
22+
23+
ret = self.bits[self.index:self.index+read_len]
24+
25+
#print(self.bits)
26+
#print(' ' * self.index + '*' * read_len + ' = ' + ret + ' (' + str(int(ret, 2)) + ')')
27+
#print()
28+
29+
self.index += read_len
30+
31+
return ret
32+
33+
def read_packet(self):
34+
version = int(self.read(3), 2)
35+
type_id = int(self.read(3), 2)
36+
37+
print('version: %s type_id: %s' % (version, type_id))
38+
39+
if type_id == 4:
40+
ret = self.parse_payload_4(version, type_id)
41+
else:
42+
ret = self.parse_payload_op(version, type_id)
43+
44+
return ret
45+
46+
def parse_payload_4(self, version, type_id):
47+
bit_string = ""
48+
more = 1
49+
while more:
50+
more = int(self.read(1))
51+
bit_string += self.read(4)
52+
53+
return {'version': version, 'type_id': type_id, 'literal': int(bit_string, 2)}
54+
55+
def parse_payload_op(self, version, type_id):
56+
subpackets = []
57+
58+
length_type_id = int(self.read(1))
59+
60+
if length_type_id == 0:
61+
subpacket_length = int(self.read(15), 2)
62+
elif length_type_id == 1:
63+
subpacket_count = int(self.read(11), 2)
64+
65+
while self.bits_left() > 12:
66+
subpacket = self.read_packet()
67+
if subpacket:
68+
subpackets.append(subpacket)
69+
else:
70+
print("no subpacket?, breaking")
71+
break
72+
73+
return {'version': version, 'type_id': type_id, 'subpackets': subpackets}
74+
75+
class BITS(object):
76+
def __init__(self):
77+
self.transmissions = []
78+
79+
def load_data(self, data):
80+
for line in data:
81+
self.transmissions.append(line)
82+
83+
def get_version_sum(self, packet):
84+
version_sum = packet.get('version')
85+
86+
if 'subpackets' in packet:
87+
for subpacket in packet['subpackets']:
88+
version_sum += self.get_version_sum(subpacket)
89+
90+
return version_sum
91+
92+
def parse_packets(self, data):
93+
print(data)
94+
bd = BITSPacketDecoder(data)
95+
print(bd.bits)
96+
print()
97+
98+
packets = bd.read_packet()
99+
100+
return packets
101+
102+
def get_data():
103+
return [l.rstrip() for l in open('data.txt', 'r').readlines()]
104+
105+
def get_test_data():
106+
return [l.rstrip() for l in open('test_data.txt', 'r').readlines()]
107+
108+
def solution_part_1(data):
109+
bits = BITS()
110+
bits.load_data(data)
111+
packets = bits.parse_packets(data)
112+
version_sum = bits.get_version_sum(packets)
113+
print('version_sum', version_sum)
114+
115+
def solution_part_2(data):
116+
bits = BITS()
117+
bits.load_data(data)
118+
packets = bits.parse_packets(data)
119+
result = bits.evaluate_packets(packets)
120+
print('eval results', result)
121+
122+
if __name__ == '__main__':
123+
solution_part_1(get_test_data())
124+
solution_part_1(get_data())
125+
126+
#solution_part_2(get_test_data())
127+
#solution_part_2(get_data())

16/data.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6051639005B56008C1D9BB3CC9DAD5BE97A4A9104700AE76E672DC95AAE91425EF6AD8BA5591C00F92073004AC0171007E0BC248BE0008645982B1CA680A7A0CC60096802723C94C265E5B9699E7E94D6070C016958F99AC015100760B45884600087C6E88B091C014959C83E740440209FC89C2896A50765A59CE299F3640D300827902547661964D2239180393AF92A8B28F4401BCC8ED52C01591D7E9D2591D7E9D273005A5D127C99802C095B044D5A19A73DC0E9C553004F000DE953588129E372008F2C0169FDB44FA6C9219803E00085C378891F00010E8FF1AE398803D1BE25C743005A6477801F59CC4FA1F3989F420C0149ED9CF006A000084C5386D1F4401F87310E313804D33B4095AFBED32ABF2CA28007DC9D3D713300524BCA940097CA8A4AF9F4C00F9B6D00088654867A7BC8BCA4829402F9D6895B2E4DF7E373189D9BE6BF86B200B7E3C68021331CD4AE6639A974232008E663C3FE00A4E0949124ED69087A848002749002151561F45B3007218C7A8FE600FC228D50B8C01097EEDD7001CF9DE5C0E62DEB089805330ED30CD3C0D3A3F367A40147E8023221F221531C9681100C717002100B36002A19809D15003900892601F950073630024805F400150D400A70028C00F5002C00252600698400A700326C0E44590039687B313BF669F35C9EF974396EF0A647533F2011B340151007637C46860200D43085712A7E4FE60086003E5234B5A56129C91FC93F1802F12EC01292BD754BCED27B92BD754BCED27B100264C4C40109D578CA600AC9AB5802B238E67495391D5CFC402E8B325C1E86F266F250B77ECC600BE006EE00085C7E8DF044001088E31420BCB08A003A72BF87D7A36C994CE76545030047801539F649BF4DEA52CBCA00B4EF3DE9B9CFEE379F14608

16/test_data.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
D2FE28
2+
38006F45291200
3+
EE00D40C823060
4+
8A004A801A8002F478
5+
620080001611562C8802118E34
6+
C0015000016115A2E0802F182340
7+
A0016C880162017C3686B18A3D4780

0 commit comments

Comments
 (0)