Frans Bergman 3 years ago
parent
commit
e5710a257d
3 changed files with 93 additions and 0 deletions
  1. 1 0
      16.input
  2. 80 0
      16.py
  3. 12 0
      16.small.input

+ 1 - 0
16.input

@@ -0,0 +1 @@
+005173980232D7F50C740109F3B9F3F0005425D36565F202012CAC0170004262EC658B0200FC3A8AB0EA5FF331201507003710004262243F8F600086C378B7152529CB4981400B202D04C00C0028048095070038C00B50028C00C50030805D3700240049210021C00810038400A400688C00C3003E605A4A19A62D3E741480261B00464C9E6A5DF3A455999C2430E0054FCBE7260084F4B37B2D60034325DE114B66A3A4012E4FFC62801069839983820061A60EE7526781E513C8050D00042E34C24898000844608F70E840198DD152262801D382460164D9BCE14CC20C179F17200812785261CE484E5D85801A59FDA64976DB504008665EB65E97C52DCAA82803B1264604D342040109E802B09E13CBC22B040154CBE53F8015796D8A4B6C50C01787B800974B413A5990400B8CA6008CE22D003992F9A2BCD421F2C9CA889802506B40159FEE0065C8A6FCF66004C695008E6F7D1693BDAEAD2993A9FEE790B62872001F54A0AC7F9B2C959535EFD4426E98CC864801029F0D935B3005E64CA8012F9AD9ACB84CC67BDBF7DF4A70086739D648BF396BFF603377389587C62211006470B68021895FCFBC249BCDF2C8200C1803D1F21DC273007E3A4148CA4008746F8630D840219B9B7C9DFFD2C9A8478CD3F9A4974401A99D65BA0BC716007FA7BFE8B6C933C8BD4A139005B1E00AC9760A73BA229A87520C017E007C679824EDC95B732C9FB04B007873BCCC94E789A18C8E399841627F6CF3C50A0174A6676199ABDA5F4F92E752E63C911ACC01793A6FB2B84D0020526FD26F6402334F935802200087C3D8DD0E0401A8CF0A23A100A0B294CCF671E00A0002110823D4231007A0D4198EC40181E802924D3272BE70BD3D4C8A100A613B6AFB7481668024200D4188C108C401D89716A080

+ 80 - 0
16.py

@@ -0,0 +1,80 @@
+from util import get_input
+from more_itertools import flatten
+from functools import reduce
+import operator
+
+input = get_input("16.input")
+
+def hextobin(a):
+    i = int(a, 16)
+    return "{:04b}".format(i)
+
+def take_input(input, n):
+    x = ""
+    for i in range(n):
+        x += input.pop(0)
+    return int("".join(x), 2)
+
+def parse_packet(input):
+    v = take_input(input, 3)
+    t = take_input(input, 3)
+    if t == 4:
+        value = ""
+        while True:
+            lead = take_input(input, 1)
+            num = take_input(input, 4)
+            value += "{:04b}".format(num)
+            if lead == 0:
+                break
+        return (v, "val", int(value, 2))
+    else:
+        lt = take_input(input, 1)
+        packets = []
+        if lt == 0:
+            ln = take_input(input, 15)
+            start_len = len(input)
+            while start_len - len(input) < ln:
+                packets.append(parse_packet(input))
+        else:
+            ln = take_input(input, 11)
+            packets = [parse_packet(input) for _ in range(ln)]
+        return (v, "op", t, packets)
+
+def v_sum(pkt):
+    if pkt[1] == "val":
+        return pkt[0]
+    else:
+        return pkt[0] + sum(v_sum(p) for p in pkt[3])
+
+def eval(pkt):
+    if pkt[1] == "val":
+        return pkt[2]
+    else:
+        (_, _, t, pkts) = pkt
+        if t == 0:
+            return sum(eval(p) for p in pkts)
+        elif t == 1:
+            return reduce(operator.mul, [eval(p) for p in pkts], 1)
+        elif t == 2:
+            return min(eval(p) for p in pkts)
+        elif t == 3:
+            return max(eval(p) for p in pkts)
+        elif t == 5:
+            return 1 if eval(pkts[0]) > eval(pkts[1]) else 0
+        elif t == 6:
+            return 1 if eval(pkts[0]) < eval(pkts[1]) else 0
+        elif t == 7:
+            return 1 if eval(pkts[0]) == eval(pkts[1]) else 0
+        else:
+            raise ValueError("Invalid packet type {}".format(t))
+
+
+for line in input:
+    line = list(flatten([hextobin(a) for a in line]))
+
+    pkt = parse_packet(line)
+    print("Part 1:", v_sum(pkt))
+    print("Part 2:", eval(pkt))
+    print("-" * 20)
+
+

+ 12 - 0
16.small.input

@@ -0,0 +1,12 @@
+8A004A801A8002F478
+620080001611562C8802118E34
+C0015000016115A2E0802F182340
+A0016C880162017C3686B18A3D4780
+C200B40A82
+04005AC33890
+880086C3E88112
+CE00C43D881120
+D8005AC2A8F0
+F600BC2D8F
+9C005AC2F8F0
+9C0141080250320F1802104A08