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