diff --git a/16/input01.txt b/16/input01.txt new file mode 100644 index 0000000..8a29c23 --- /dev/null +++ b/16/input01.txt @@ -0,0 +1 @@ +E20D72805F354AE298E2FCC5339218F90FE5F3A388BA60095005C3352CF7FBF27CD4B3DFEFC95354723006C401C8FD1A23280021D1763CC791006E25C198A6C01254BAECDED7A5A99CCD30C01499CFB948F857002BB9FCD68B3296AF23DD6BE4C600A4D3ED006AA200C4128E10FC0010C8A90462442A5006A7EB2429F8C502675D13700BE37CF623EB3449CAE732249279EFDED801E898A47BE8D23FBAC0805527F99849C57A5270C064C3ECF577F4940016A269007D3299D34E004DF298EC71ACE8DA7B77371003A76531F20020E5C4CC01192B3FE80293B7CD23ED55AA76F9A47DAAB6900503367D240522313ACB26B8801B64CDB1FB683A6E50E0049BE4F6588804459984E98F28D80253798DFDAF4FE712D679816401594EAA580232B19F20D92E7F3740D1003880C1B002DA1400B6028BD400F0023A9C00F50035C00C5002CC0096015B0C00B30025400D000C398025E2006BD800FC9197767C4026D78022000874298850C4401884F0E21EC9D256592007A2C013967C967B8C32BCBD558C013E005F27F53EB1CE25447700967EBB2D95BFAE8135A229AE4FFBB7F6BC6009D006A2200FC3387D128001088E91121F4DED58C025952E92549C3792730013ACC0198D709E349002171060DC613006E14C7789E4006C4139B7194609DE63FEEB78004DF299AD086777ECF2F311200FB7802919FACB38BAFCFD659C5D6E5766C40244E8024200EC618E11780010B83B09E1BCFC488C017E0036A184D0A4BB5CDD0127351F56F12530046C01784B3FF9C6DFB964EE793F5A703360055A4F71F12C70000EC67E74ED65DE44AA7338FC275649D7D40041E4DDA794C80265D00525D2E5D3E6F3F26300426B89D40094CCB448C8F0C017C00CC0401E82D1023E0803719E2342D9FB4E5A01300665C6A5502457C8037A93C63F6B4C8B40129DF7AC353EF2401CC6003932919B1CEE3F1089AB763D4B986E1008A7354936413916B9B080 \ No newline at end of file diff --git a/16/input01_sample.txt b/16/input01_sample.txt new file mode 100644 index 0000000..1093969 --- /dev/null +++ b/16/input01_sample.txt @@ -0,0 +1,6 @@ +D2FE28 +38006F45291200 +8A004A801A8002F478 +620080001611562C8802118E34 +C0015000016115A2E0802F182340 +A0016C880162017C3686B18A3D4780 \ No newline at end of file diff --git a/16/input02_sample.txt b/16/input02_sample.txt new file mode 100644 index 0000000..ae6c0df --- /dev/null +++ b/16/input02_sample.txt @@ -0,0 +1,8 @@ +C200B40A82 +04005AC33890 +880086C3E88112 +CE00C43D881120 +D8005AC2A8F0 +F600BC2D8F +9C005AC2F8F0 +9C0141080250320F1802104A08 \ No newline at end of file diff --git a/16/solve01.py b/16/solve01.py new file mode 100644 index 0000000..953cb6c --- /dev/null +++ b/16/solve01.py @@ -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) \ No newline at end of file diff --git a/16/solve02.py b/16/solve02.py new file mode 100644 index 0000000..54fc0c6 --- /dev/null +++ b/16/solve02.py @@ -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)