Browse Source

2020/18

master
Roderic Day 4 years ago
parent
commit
88e6e6052c
2 changed files with 78 additions and 0 deletions
  1. +47
    -0
      y2020/p17.py
  2. +31
    -0
      y2020/p18.py

+ 47
- 0
y2020/p17.py View File

@@ -0,0 +1,47 @@
import sys
from itertools import product


def span(n):
return list(range(-n - 1, n + 2))


def neighbors(pos):
return {
tuple(t + dt for t, dt in zip(pos, deltas))
for deltas in product([-1, 0, 1], repeat=len(pos))
if set(deltas) != {0}
}


def condition(known, pos):
active = pos in known
count = len(neighbors(pos) & known)
return (active and count in {2, 3}) or (not active and count in {3})


def evolve(known, dims, n_cycles):
for _ in range(n_cycles):
dims = [n + 1 for n in dims]
known = {
pos
for pos in product(*map(span, dims))
if condition(known, pos)
}
return known


text = sys.stdin.read()
known = {
(x, y, 0)
for y, ln in enumerate(text.splitlines())
for x, char in enumerate(ln)
if char == '#'
}
dims = tuple([
max(x + 1 for x, _, _ in known),
max(y + 1 for _, y, _ in known),
max(z + 1 for _, _, z in known),
])
print(len(evolve(known, dims, 6)))
print(len(evolve({pt + (0,) for pt in known}, dims + (1,), 6)))

+ 31
- 0
y2020/p18.py View File

@@ -0,0 +1,31 @@
import re
import sys


def reval1(ln):
a, *rest = ln.split()
for b, c in zip(*[iter(rest)] * 2):
a = eval(f'{a} {b} {c}')
return a


def reval2(ln):
while '+' in ln:
ln = re.sub(r'\d+ \+ \d+', lambda m: str(eval(m.group(0))), ln)
return eval(ln)


def process(ln, reval):
while '(' in ln:
ln = re.sub(r'\(([^\(\)]+)\)', lambda m: str(reval(m.group(1))), ln)
return reval(ln)


text = sys.stdin.read()
ans1 = 0
ans2 = 0
for ln in text.splitlines():
ans1 += int(process(ln, reval=reval1))
ans2 += int(process(ln, reval=reval2))
print(ans1)
print(ans2)

Loading…
Cancel
Save