1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import argparse
- import functools
- from typing import NamedTuple, List, Dict, Set, Tuple
- parser = argparse.ArgumentParser()
- parser.add_argument("ifile", type=argparse.FileType('r'))
- args = parser.parse_args()
- coords: List[Tuple[int, int]] = []
- folds: List[Tuple[str, int]] = []
- toggle = False
- for line in args.ifile.readlines():
- if line.strip() == "":
- toggle = True
- continue
- if toggle:
- fold = line.strip().split(" ")[2].split("=")
- folds.append((fold[0], int(fold[1])))
- else:
- coord = line.strip().split(",")
- coords.append((int(coord[0]), int(coord[1])))
- max_x = max(map(lambda pair: pair[0], coords))
- max_y = max(map(lambda pair: pair[1], coords))
- sheet = [[False for _ in range(0, max_x + 1)] for _ in range(0, max_y + 1)]
- for (x, y) in coords:
- sheet[y][x] = True
- def foldX(foldLine: int, sheet: List[List[bool]]):
- new_max_x = foldLine
- new = [[False for _ in range(0, new_max_x)] for _ in range(0, len(sheet))]
- for y in range(0, len(sheet)):
- for x in range(0, new_max_x):
- new[y][x] = new[y][x] or sheet[y][x]
- for x in range(0, len(sheet[0]) - foldLine - 1):
- new[y][new_max_x - x - 1] = new[y][new_max_x - x - 1] or sheet[y][new_max_x + x + 1]
- return new
- def foldY(foldLine: int, sheet: List[List[bool]]):
- new_max_y = foldLine
- new = [[False for _ in range(0, len(sheet[0]))] for _ in range(0, new_max_y)]
- for x in range(0, len(sheet[0])):
- for y in range(0, new_max_y):
- new[y][x] = new[y][x] or sheet[y][x]
- for y in range(0, len(sheet) - foldLine - 1):
- new[new_max_y - y - 1][x] = new[new_max_y - y - 1][x] or sheet[new_max_y + y + 1][x]
- return new
- for fold in folds:
- if fold[0] == 'x':
- sheet = foldX(fold[1], sheet)
- else:
- sheet = foldY(fold[1], sheet)
- print(sum([sum(map(int, line)) for line in sheet]))
- for line in sheet:
- print("".join(map(lambda p: "#" if p else '.', line)))
|