Roderic Day преди 1 година
родител
ревизия
4ad572849d
променени са 2 файла, в които са добавени 33 реда и са изтрити 19 реда
  1. +21
    -19
      y2023/p05.py
  2. +12
    -0
      y2023/p09.py

+ 21
- 19
y2023/p05.py Целия файл

@@ -3,33 +3,35 @@ import pathlib
import re


text = open(0).read()
[seed], *groups = [[[int(n) for n in ln.split()] for ln in group.split(':')[1].strip().splitlines()] for group in text.split('\n\n')]
def forward(n, groups):
for group in groups:
for b, a, c in group:
if a <= n < a + c:
n = n + (b - a)
break
return n


def forward(n):
for group in groups:
n = next((n + (b - a) for b, a, c in group if a <= n < a + c), n)
def backward(n, groups):
for group in reversed(groups):
for b, a, c in group:
if b <= n < b + c:
n = n - (b - a)
break
return n


ans1 = min([forward(n) for n in seed])
text = open(0).read()
to_matrix = lambda string: [[int(n) for n in ln.split()] for ln in string.splitlines()]
[seed], *groups = [to_matrix(string.split(':')[1].strip()) for string in text.split('\n\n')]

ans1 = min([forward(n, groups) for n in seed])
print(ans1)

ns = []
pairs = [(a, a + b) for a, b in zip(seed[::2], seed[1::2])]
for group in reversed(groups):
ns += [n for b, a, c in group for n in [b, b + c - 1]]
ns = [next((n - (b - a) for b, a, c in group if b <= n < b + c), n) for n in ns]
ans2 = min(forward(n) for n in ns if any(a <= n < a + b for a, b in zip(seed[::2], seed[1::2])))
ns = [backward(n, [group]) for n in ns]
ans2 = min(forward(n, groups) for n in ns if any(a <= n < b for a, b in pairs))
print(ans2)


# old method, slow
def backward(n):
for group in groups[::-1]:
n = next((n - (b - a) for b, a, c in group if b <= n < b + c), n)
return n


pairs = [(a, a + b) for a, b in zip(seed[::2], seed[1::2])]
next(n for n in itertools.count(ans2) if any(a <= backward(n) < b for a, b in pairs))

+ 12
- 0
y2023/p09.py Целия файл

@@ -0,0 +1,12 @@
def historicize(ns):
tails = [ns[-1]]
while len(set(ns)) > 1:
ns = [b - a for a, b in zip(ns, ns[1:])]
tails.append(ns[-1])
return sum(tails)


text = open(0).read()
data = [[int(n) for n in line.split()] for line in text.splitlines()]
print(sum(historicize(ns) for ns in data))
print(sum(historicize(ns[::-1]) for ns in data))

Loading…
Отказ
Запис