Roderic Day 5 lat temu
rodzic
commit
b2cd1f009a
1 zmienionych plików z 13 dodań i 11 usunięć
  1. +13
    -11
      y2018/p17.py

+ 13
- 11
y2018/p17.py Wyświetl plik

@@ -1,11 +1,11 @@
import collections
import re
from pathlib import Path
import sys


def read_in():
grid = collections.defaultdict(lambda: ' ')
for _ in Path('y2018/p17.dat').read_text().splitlines():
for _ in sys.stdin.read().splitlines():
_ = _.replace(',', ';')
_ = re.sub(r'(\d+)\.\.(\d+)', r'range(\1, \2 + 1)', _)
_ = re.sub(r'=(\d+)', r'=[\1]', _)
@@ -15,20 +15,23 @@ def read_in():


def write_out(grid, path):
xmin, *_, xmax = sorted(x for x, y in grid)
ymin, *_, ymax = sorted(y for x, y in grid)
text = '\n'.join(
''.join(grid[x, y] for x in range(xmin - 5, xmax + 5))
for y in range(ymin, ymax + 1)
)
Path(path).write_text(text)
with open('p17out.dat', 'w') as fp:
fp.write(text)


def flow(start):
def flow(grid, start, ymax):
stack = [start]
while stack:
x, y = stack.pop()
grid[x, y] = '~'

if y > ymax:
if y >= ymax:
break

for dx, dy in [(1, 0), (-1, 0), (0, 1)]:
@@ -40,10 +43,10 @@ def flow(start):
if grid[new] == ' ':
stack.append(new)

drain((x, y))
drain(grid, (x, y), ymax)


def drain(end):
def drain(grid, end, ymax):
stack = [end]
while stack:
x, y = stack.pop()
@@ -51,7 +54,7 @@ def drain(end):

left, right, below = grid[x - 1, y], grid[x + 1, y], grid[x, y + 1]
if all([right == ' ', left == '|', below != '|']):
flow((x + 1, y))
flow(grid, (x + 1, y), ymax)

for dx, dy in [(-1, 0), (1, 0), (0, -1)]:
new = x + dx, y + dy
@@ -60,9 +63,8 @@ def drain(end):


grid = read_in()
xmin, *_, xmax = sorted(x for x, y in grid)
ymin, *_, ymax = sorted(y for x, y in grid)
flow((500, 0))
ymin, *_, ymax = sorted(y for x, y in grid if grid[x, y] == '#')
flow(grid, (500, ymin), ymax)
counter = collections.Counter(grid.values())
print(counter['~'] + counter['|'])
print(counter['~'])

Ładowanie…
Anuluj
Zapisz