|
|
@@ -0,0 +1,60 @@ |
|
|
|
import functools as ft |
|
|
|
import operator as op |
|
|
|
|
|
|
|
|
|
|
|
opes = { |
|
|
|
0: sum, |
|
|
|
1: lambda ns: ft.reduce(op.mul, ns), |
|
|
|
2: min, |
|
|
|
3: max, |
|
|
|
4: None, |
|
|
|
5: lambda ns: op.gt(ns[0], ns[1]), |
|
|
|
6: lambda ns: op.lt(ns[0], ns[1]), |
|
|
|
7: lambda ns: op.eq(ns[0], ns[1]), |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
def read(stream, n): |
|
|
|
return int(''.join(next(stream) for _ in range(n)), 2) |
|
|
|
|
|
|
|
|
|
|
|
def literal(stream): |
|
|
|
coll = 0 |
|
|
|
while next(stream) == '1': |
|
|
|
coll |= read(stream, 4) |
|
|
|
coll <<= 4 |
|
|
|
coll |= read(stream, 4) |
|
|
|
return coll |
|
|
|
|
|
|
|
|
|
|
|
def consume(stream): |
|
|
|
ver = read(stream, 3) |
|
|
|
vers.append(ver) |
|
|
|
tid = read(stream, 3) |
|
|
|
ope = opes[tid] |
|
|
|
if ope is None: |
|
|
|
return literal(stream) |
|
|
|
else: |
|
|
|
I = next(stream) |
|
|
|
if I == '1': |
|
|
|
length = read(stream, 11) |
|
|
|
ns = [consume(stream) for _ in range(length)] |
|
|
|
return ope(ns) |
|
|
|
elif I == '0': |
|
|
|
length = read(stream, 15) |
|
|
|
sub = (next(stream) for _ in range(length)) |
|
|
|
ns = [] |
|
|
|
while True: |
|
|
|
try: |
|
|
|
ns.append(consume(sub)) |
|
|
|
except RuntimeError: |
|
|
|
break |
|
|
|
return ope(ns) |
|
|
|
|
|
|
|
|
|
|
|
vers = [] |
|
|
|
text = open(0).read().strip() |
|
|
|
stream = iter(''.join(f'{int(char, 16):0>4b}' for char in text)) |
|
|
|
ans = consume(stream) |
|
|
|
print(sum(vers)) |
|
|
|
print(ans) |