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