summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMia Herkt <mia@0x0.st>2021-12-17 01:13:09 +0100
committerMia Herkt <mia@0x0.st>2021-12-17 01:13:09 +0100
commita775f8fcb1a2fe254b51b04b9e5250e1f144472a (patch)
treef4860b0362ae9bf6d8667faadbf124f58e4be679
parent0751db1e06f4d4187630ed3786ae406f7fe4f1c7 (diff)
downloadaoc2021-a775f8fcb1a2fe254b51b04b9e5250e1f144472a.tar.bz2
aoc2021-a775f8fcb1a2fe254b51b04b9e5250e1f144472a.tar.xz
Day 16: Add Python solution
-rw-r--r--16/input.txt1
-rwxr-xr-x16/solution.py57
2 files changed, 58 insertions, 0 deletions
diff --git a/16/input.txt b/16/input.txt
new file mode 100644
index 0000000..62f852c
--- /dev/null
+++ b/16/input.txt
@@ -0,0 +1 @@
+E20D4100AA9C0199CA6A3D9D6352294D47B3AC6A4335FBE3FDD251003873657600B46F8DC600AE80273CCD2D5028B6600AF802B2959524B727D8A8CC3CCEEF3497188C017A005466DAA6FDB3A96D5944C014C006865D5A7255D79926F5E69200A164C1A65E26C867DDE7D7E4794FE72F3100C0159A42952A7008A6A5C189BCD456442E4A0A46008580273ADB3AD1224E600ACD37E802200084C1083F1540010E8D105A371802D3B845A0090E4BD59DE0E52FFC659A5EBE99AC2B7004A3ECC7E58814492C4E2918023379DA96006EC0008545B84B1B00010F8E915E1E20087D3D0E577B1C9A4C93DD233E2ECF65265D800031D97C8ACCCDDE74A64BD4CC284E401444B05F802B3711695C65BCC010A004067D2E7C4208A803F23B139B9470D7333B71240050A20042236C6A834600C4568F5048801098B90B626B00155271573008A4C7A71662848821001093CB4A009C77874200FCE6E7391049EB509FE3E910421924D3006C40198BB11E2A8803B1AE2A4431007A15C6E8F26009E002A725A5292D294FED5500C7170038C00E602A8CC00D60259D008B140201DC00C401B05400E201608804D45003C00393600B94400970020C00F6002127128C0129CDC7B4F46C91A0084E7C6648DC000DC89D341B23B8D95C802D09453A0069263D8219DF680E339003032A6F30F126780002CC333005E8035400042635C578A8200DC198890AA46F394B29C4016A4960C70017D99D7E8AF309CC014FCFDFB0FE0DA490A6F9D490010567A3780549539ED49167BA47338FAAC1F3005255AEC01200043A3E46C84E200CC4E895114C011C0054A522592912C9C8FDE10005D8164026C70066C200C4618BD074401E8C90E23ACDFE5642700A6672D73F285644B237E8CCCCB77738A0801A3CFED364B823334C46303496C940 \ No newline at end of file
diff --git a/16/solution.py b/16/solution.py
new file mode 100755
index 0000000..3a53f0e
--- /dev/null
+++ b/16/solution.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+
+import sys
+from operator import mul
+from functools import reduce
+from itertools import tee, takewhile, islice
+
+packet = sys.stdin.readline().rstrip()
+bitstr = "".join([f"{int(x,16):04b}" for x in packet])
+
+ops = {
+ 0: sum,
+ 1: lambda l: reduce(mul, l, 1),
+ 2: min,
+ 3: max,
+ 5: lambda l: 1 if l[0] > l[1] else 0,
+ 6: lambda l: 1 if l[0] < l[1] else 0,
+ 7: lambda l: 1 if l[0] == l[1] else 0,
+}
+
+def decode(p):
+ ver = int(p[0:3],2)
+ pid = int(p[3:6],2)
+ versum = ver
+
+ if pid == 4:
+ a, b = tee(map(lambda b: (int(b[0],2), int("".join(b[1:]), 2)),
+ zip(*(iter(p[6:]),)*5)))
+ n = sum(takewhile(lambda s: s, map(lambda x: x[0], a))) + 1
+ val = reduce(lambda a, b: a << 4 | b[1], islice(b, n), 0)
+ plen = 6 + n * 5
+
+ return plen, val, ver
+ else:
+ typ = int(p[6],2)
+ rvals = []
+ start = 7+(11 if typ else 15)
+ plen = int(p[7:start],2)
+ if typ:
+ for i in range(plen):
+ l, v, vn = decode(p[start:])
+ rvals.append(v)
+ start += l
+ versum+=vn
+ else:
+ while plen:
+ l, v, vn = decode(p[start:start+plen])
+ rvals.append(v)
+ start += l
+ plen -= l
+ versum+=vn
+
+ rval = ops[pid](rvals)
+ return start, rval, versum
+
+_, gold, silver = decode(bitstr)
+print(f"Silver: {silver}\nGold: {gold}")