浏览代码

bonita

master
Roderic Day 3 年前
父节点
当前提交
877b8e04ca
共有 2 个文件被更改,包括 61 次插入1 次删除
  1. +1
    -1
      makefile
  2. +60
    -0
      y2021/p16.py

+ 1
- 1
makefile 查看文件

@@ -4,7 +4,7 @@ DATA = $(shell echo $(FILE) | sed s/.py/.dat/)
PYTHONPATH = .
export

main: venv/ $(DATA)
main: venv/
@venv/bin/python -u toolkit.py $(FILE)
@cat $(DATA) | venv/bin/python -u $(FILE)


+ 60
- 0
y2021/p16.py 查看文件

@@ -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)

正在加载...
取消
保存