From a775f8fcb1a2fe254b51b04b9e5250e1f144472a Mon Sep 17 00:00:00 2001 From: Mia Herkt Date: Fri, 17 Dec 2021 01:13:09 +0100 Subject: [PATCH] Day 16: Add Python solution --- 16/input.txt | 1 + 16/solution.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 16/input.txt create mode 100755 16/solution.py 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}")