Parcourir la source

2016/14

master
Roderic Day il y a 4 ans
Parent
révision
0dee7412c2
4 fichiers modifiés avec 111 ajouts et 13 suppressions
  1. +7
    -13
      toolkit.py
  2. +53
    -0
      y2016/p12.py
  3. +27
    -0
      y2016/p13.py
  4. +24
    -0
      y2016/p14.py

+ 7
- 13
toolkit.py Voir le fichier

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

+ 53
- 0
y2016/p12.py Voir le fichier

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

+ 27
- 0
y2016/p13.py Voir le fichier

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

+ 24
- 0
y2016/p14.py Voir le fichier

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

Chargement…
Annuler
Enregistrer