added day 16

This commit is contained in:
Peter Hudec 2021-12-18 09:22:01 +01:00
parent d6179dc2e6
commit 014e25c4f9
5 changed files with 141 additions and 0 deletions

1
16/input01.txt Normal file
View File

@ -0,0 +1 @@
E20D72805F354AE298E2FCC5339218F90FE5F3A388BA60095005C3352CF7FBF27CD4B3DFEFC95354723006C401C8FD1A23280021D1763CC791006E25C198A6C01254BAECDED7A5A99CCD30C01499CFB948F857002BB9FCD68B3296AF23DD6BE4C600A4D3ED006AA200C4128E10FC0010C8A90462442A5006A7EB2429F8C502675D13700BE37CF623EB3449CAE732249279EFDED801E898A47BE8D23FBAC0805527F99849C57A5270C064C3ECF577F4940016A269007D3299D34E004DF298EC71ACE8DA7B77371003A76531F20020E5C4CC01192B3FE80293B7CD23ED55AA76F9A47DAAB6900503367D240522313ACB26B8801B64CDB1FB683A6E50E0049BE4F6588804459984E98F28D80253798DFDAF4FE712D679816401594EAA580232B19F20D92E7F3740D1003880C1B002DA1400B6028BD400F0023A9C00F50035C00C5002CC0096015B0C00B30025400D000C398025E2006BD800FC9197767C4026D78022000874298850C4401884F0E21EC9D256592007A2C013967C967B8C32BCBD558C013E005F27F53EB1CE25447700967EBB2D95BFAE8135A229AE4FFBB7F6BC6009D006A2200FC3387D128001088E91121F4DED58C025952E92549C3792730013ACC0198D709E349002171060DC613006E14C7789E4006C4139B7194609DE63FEEB78004DF299AD086777ECF2F311200FB7802919FACB38BAFCFD659C5D6E5766C40244E8024200EC618E11780010B83B09E1BCFC488C017E0036A184D0A4BB5CDD0127351F56F12530046C01784B3FF9C6DFB964EE793F5A703360055A4F71F12C70000EC67E74ED65DE44AA7338FC275649D7D40041E4DDA794C80265D00525D2E5D3E6F3F26300426B89D40094CCB448C8F0C017C00CC0401E82D1023E0803719E2342D9FB4E5A01300665C6A5502457C8037A93C63F6B4C8B40129DF7AC353EF2401CC6003932919B1CEE3F1089AB763D4B986E1008A7354936413916B9B080

6
16/input01_sample.txt Normal file
View File

@ -0,0 +1,6 @@
D2FE28
38006F45291200
8A004A801A8002F478
620080001611562C8802118E34
C0015000016115A2E0802F182340
A0016C880162017C3686B18A3D4780

8
16/input02_sample.txt Normal file
View File

@ -0,0 +1,8 @@
C200B40A82
04005AC33890
880086C3E88112
CE00C43D881120
D8005AC2A8F0
F600BC2D8F
9C005AC2F8F0
9C0141080250320F1802104A08

56
16/solve01.py Normal file
View File

@ -0,0 +1,56 @@
#!/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)

70
16/solve02.py Normal file
View File

@ -0,0 +1,70 @@
#!/usr/bin/env python
import numpy
def decode_packet(packet):
# import pdb; pdb.set_trace()
# get version
v = int(packet[:3], 2)
packet = packet[3:]
# get type
t = int(packet[:3], 2)
packet = packet[3:]
# literal, no other sub packets
if t == 4:
value = ''
while True:
l = packet[:1]
value = value + packet[1:5]
packet = packet[5:]
if int(l[0],2) == 0:
break
return (int(value, 2), packet)
values = []
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
values = values + [tmp_r]
if i == 1:
l = int(packet[:11], 2)
packet = packet[11:]
for x in range(l):
(tmp_r, tmp_p) = decode_packet(packet)
values = values + [tmp_r]
packet = tmp_p
if t == 0:
return(sum(values), packet)
if t == 1:
return(numpy.prod(values), packet)
if t == 2:
return(min(values), packet)
if t == 3:
return(max(values), packet)
if t == 5:
return(int(values[0] > values[1]), packet)
if t == 6:
return(int(values[0] < values[1]), packet)
if t == 7:
return(int(values[0] == values[1]), packet)
return None
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)