| @@ -75,7 +75,22 @@ def md5gen(template, pattern=r'.+', batch=6000): | |||
| def interpret(string, globals): | |||
| fn, *args = ( | |||
| x if x.replace('_', '').isalpha() else eval(x) | |||
| x if x[0].isalpha() else eval(x) | |||
| for x in string.split() | |||
| ) | |||
| globals[fn](**dict(zip(*[iter(args)] * 2))) | |||
| def loop_consume(lines, handler): | |||
| instructions = collections.deque(lines) | |||
| count = 0 | |||
| while instructions: | |||
| ok = handler(instructions[0]) | |||
| if ok: | |||
| instructions.popleft() | |||
| count = 0 | |||
| elif count < len(instructions): | |||
| instructions.rotate(1) | |||
| count += 1 | |||
| else: | |||
| raise RuntimeError('Reached steady state') | |||
| @@ -30,8 +30,8 @@ def unzip_len(text, recurse=False): | |||
| text = sys.stdin.read().strip() | |||
| # ans1 = unzip_len(text) | |||
| # print(ans1) | |||
| ans1 = unzip_len(text) | |||
| print(ans1) | |||
| ans2 = unzip_len(text, recurse=True) | |||
| print(ans2) | |||
| @@ -0,0 +1,26 @@ | |||
| import collections | |||
| import sys | |||
| import toolkit | |||
| def handle(string): | |||
| if string.startswith('value'): | |||
| _, value, _, _, t0, i0 = string.split() | |||
| regs[t0 + i0].append(int(value)) | |||
| return True | |||
| elif string.startswith('bot'): | |||
| t0, i0, _, _, _, t1, i1, _, _, _, t2, i2 = string.split() | |||
| try: | |||
| lo, hi = sorted(regs[t0 + i0]) | |||
| except ValueError: | |||
| return False | |||
| regs[t1 + i1].append(lo) | |||
| regs[t2 + i2].append(hi) | |||
| return True | |||
| regs = collections.defaultdict(list) | |||
| toolkit.loop_consume(sys.stdin.read().splitlines(), handle) | |||
| print(next(k for k, v in regs.items() if set(v) == {17, 61})) | |||
| print(regs['output0'][0] * regs['output1'][0] * regs['output2'][0]) | |||