| @@ -1,8 +1,8 @@ | |||
| import collections | |||
| import hashlib | |||
| import itertools | |||
| import os | |||
| import re | |||
| import subprocess | |||
| import sys | |||
| from pathlib import Path | |||
| @@ -65,20 +65,14 @@ def get_dat(): | |||
| Path(path).write_bytes(response.content) | |||
| def md5gen(template, pattern=r'.+', batch=6000): | |||
| for i in itertools.count(): | |||
| strings = (template.format(i=i * batch + k) for k in range(batch)) | |||
| args = [c for s in strings for c in ['-s', s]] | |||
| out = subprocess.check_output(['md5'] + args).decode() | |||
| yield from re.findall(rf'"(.+)"\) = ({pattern})', out) | |||
| def batch(iterable, size): | |||
| count = itertools.count() | |||
| for _, sub in itertools.groupby(iterable, lambda _: next(count) // size): | |||
| yield sub | |||
| def interpret(string, globals): | |||
| fn, *args = ( | |||
| x if x[0].isalpha() else eval(x) | |||
| for x in string.split() | |||
| ) | |||
| globals[fn](**dict(zip(*[iter(args)] * 2))) | |||
| def md5(string): | |||
| return hashlib.md5(string.encode()).hexdigest() | |||
| def loop_consume(lines, handler): | |||
| @@ -0,0 +1,53 @@ | |||
| import sys | |||
| def get(x): | |||
| return regs[x] if x in regs else int(x) | |||
| def cpy(x, y): | |||
| regs[y] = get(x) | |||
| def inc(x): | |||
| regs[x] += 1 | |||
| def dec(x): | |||
| regs[x] -= 1 | |||
| def jnz(x, y): | |||
| if get(x) != 0: | |||
| return int(y) | |||
| def run(regs, lim=1000): | |||
| pos = 0 | |||
| seen = {} | |||
| for _ in range(lim): | |||
| fn, *args = instructions[pos].split() | |||
| pos += eval(fn)(*args) or 1 | |||
| if regs['d'] not in seen: | |||
| seen[regs['d']] = regs['a'] | |||
| print(sorted(seen)) | |||
| text = sys.stdin.read() | |||
| instructions = text.splitlines() | |||
| regs = {k: 0 for k in 'abcd'} | |||
| run(regs) | |||
| regs['c'] = 1 | |||
| run(regs) | |||
| def fib(n): | |||
| a, b = 0, 1 | |||
| for _ in range(n): | |||
| a, b = b, a + b | |||
| return b | |||
| print(fib(27) + 19 * 11) | |||
| print(fib(34) + 19 * 11) | |||
| @@ -0,0 +1,27 @@ | |||
| import sys | |||
| def is_open(x, y): | |||
| n = x*x + 3*x + 2*x*y + y + y*y + inp | |||
| return f'{n:b}'.count('1') % 2 == 0 | |||
| inp = int(sys.stdin.read()) | |||
| valid = { | |||
| complex(x, y) | |||
| for y in range(50) | |||
| for x in range(50) | |||
| if is_open(x, y) | |||
| } | |||
| steps = (1, -1, 1j, -1j) | |||
| edge = {1 + 1j} | |||
| seen = set() | |||
| hop = 0 | |||
| while 31 + 39j not in seen: | |||
| edge = {old + step for old in edge for step in steps} & valid - seen | |||
| seen |= edge | |||
| hop += 1 | |||
| if hop == 50: | |||
| ans2 = len(seen) | |||
| print(hop) | |||
| print(ans2) | |||
| @@ -0,0 +1,24 @@ | |||
| import re | |||
| import sys | |||
| import toolkit | |||
| text = sys.stdin.read().strip() | |||
| found = {i: toolkit.md5(f'{text}{i}') for i in range(30_000)} | |||
| print([ | |||
| i | |||
| for i, dig in found.items() | |||
| for c in re.findall(r'(.)\1\1', dig)[:1] | |||
| if any(c * 5 in found.get(i + j + 1, '') for j in range(1000)) | |||
| ][63]) | |||
| for _ in range(2016): | |||
| found = {k: toolkit.md5(v) for k, v in found.items()} | |||
| print([ | |||
| i | |||
| for i, dig in found.items() | |||
| for c in re.findall(r'(.)\1\1', dig)[:1] | |||
| if any(c * 5 in found.get(i + j + 1, '') for j in range(1000)) | |||
| ][63]) | |||