diff --git a/2021/16.input b/2021/16.input new file mode 100644 index 0000000..546317d --- /dev/null +++ b/2021/16.input @@ -0,0 +1 @@ +A052E04CFD9DC0249694F0A11EA2044E200E9266766AB004A525F86FFCDF4B25DFC401A20043A11C61838600FC678D51B8C0198910EA1200010B3EEA40246C974EF003331006619C26844200D414859049402D9CDA64BDEF3C4E623331FBCCA3E4DFBBFC79E4004DE96FC3B1EC6DE4298D5A1C8F98E45266745B382040191D0034539682F4E5A0B527FEB018029277C88E0039937D8ACCC6256092004165D36586CC013A008625A2D7394A5B1DE16C0E3004A8035200043220C5B838200EC4B8E315A6CEE6F3C3B9FFB8100994200CC59837108401989D056280803F1EA3C41130047003530004323DC3C860200EC4182F1CA7E452C01744A0A4FF6BBAE6A533BFCD1967A26E20124BE1920A4A6A613315511007A4A32BE9AE6B5CAD19E56BA1430053803341007E24C168A6200D46384318A6AAC8401907003EF2F7D70265EFAE04CCAB3801727C9EC94802AF92F493A8012D9EABB48BA3805D1B65756559231917B93A4B4B46009C91F600481254AF67A845BA56610400414E3090055525E849BE8010397439746400BC255EE5362136F72B4A4A7B721004A510A7370CCB37C2BA0010D3038600BE802937A429BD20C90CCC564EC40144E80213E2B3E2F3D9D6DB0803F2B005A731DC6C524A16B5F1C1D98EE006339009AB401AB0803108A12C2A00043A134228AB2DBDA00801EC061B080180057A88016404DA201206A00638014E0049801EC0309800AC20025B20080C600710058A60070003080006A4F566244012C4B204A83CB234C2244120080E6562446669025CD4802DA9A45F004658527FFEC720906008C996700397319DD7710596674004BE6A161283B09C802B0D00463AC9563C2B969F0E080182972E982F9718200D2E637DB16600341292D6D8A7F496800FD490BCDC68B33976A872E008C5F9DFD566490A14 \ No newline at end of file diff --git a/2021/16.py b/2021/16.py new file mode 100644 index 0000000..f991199 --- /dev/null +++ b/2021/16.py @@ -0,0 +1,60 @@ +with open('./2021/16.input') as input_file: + input_data = input_file.read() +ll = input_data + +d = bin(int(ll, 16))[2:] +while len(d) < 4 * len(ll): + d = '0' + d + +def peek(data, n): + ret = data[0][:n] + data[0] = data[0][n:] + return ret + +sumofversions = 0 +def parse(data): + global sumofversions + + version = int(peek(data, 3), 2) + sumofversions += version + + tid = int(peek(data, 3), 2) + if tid == 4: + t = [] + while True: + cnt, *v = peek(data, 5) + t += v + if cnt == '0': + break + return int("".join(t), 2) + + ltid = peek(data, 1)[0] + spv = [] + if ltid == '0': + subpacketslen = int(peek(data, 15), 2) + subpackets = [peek(data, subpacketslen)] + while subpackets[0]: + spv.append(parse(subpackets)) + else: + spv = [parse(data) for i in range(int(peek(data, 11), 2))] + if tid == 0: + return sum(spv) + elif tid == 1: + p = 1 + for x in spv: + p *= x + return p + elif tid == 2: + return min(spv) + elif tid == 3: + return max(spv) + elif tid == 5: + return int(spv[0] > spv[1]) + elif tid == 6: + return int(spv[0] < spv[1]) + elif tid == 7: + return int(spv[0] == spv[1]) + +p2 = parse([d]) +print(sumofversions) +print(p2) \ No newline at end of file diff --git a/2021/16.test b/2021/16.test new file mode 100644 index 0000000..d4de4d5 --- /dev/null +++ b/2021/16.test @@ -0,0 +1 @@ +8A004A801A8002F478 \ No newline at end of file