part1.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import argparse
  2. import functools
  3. from typing import NamedTuple, List, Dict, Set, Tuple
  4. parser = argparse.ArgumentParser()
  5. parser.add_argument("ifile", type=argparse.FileType('r'))
  6. args = parser.parse_args()
  7. coords: List[Tuple[int, int]] = []
  8. folds: List[Tuple[str, int]] = []
  9. toggle = False
  10. for line in args.ifile.readlines():
  11. if line.strip() == "":
  12. toggle = True
  13. continue
  14. if toggle:
  15. fold = line.strip().split(" ")[2].split("=")
  16. folds.append((fold[0], int(fold[1])))
  17. else:
  18. coord = line.strip().split(",")
  19. coords.append((int(coord[0]), int(coord[1])))
  20. max_x = max(map(lambda pair: pair[0], coords))
  21. max_y = max(map(lambda pair: pair[1], coords))
  22. sheet = [[False for _ in range(0, max_x + 1)] for _ in range(0, max_y + 1)]
  23. for (x, y) in coords:
  24. sheet[y][x] = True
  25. def foldX(foldLine: int, sheet: List[List[bool]]):
  26. new_max_x = foldLine
  27. new = [[False for _ in range(0, new_max_x)] for _ in range(0, len(sheet))]
  28. for y in range(0, len(sheet)):
  29. for x in range(0, new_max_x):
  30. new[y][x] = new[y][x] or sheet[y][x]
  31. for x in range(0, len(sheet[0]) - foldLine - 1):
  32. new[y][new_max_x - x - 1] = new[y][new_max_x - x - 1] or sheet[y][new_max_x + x + 1]
  33. return new
  34. def foldY(foldLine: int, sheet: List[List[bool]]):
  35. new_max_y = foldLine
  36. new = [[False for _ in range(0, len(sheet[0]))] for _ in range(0, new_max_y)]
  37. for x in range(0, len(sheet[0])):
  38. for y in range(0, new_max_y):
  39. new[y][x] = new[y][x] or sheet[y][x]
  40. for y in range(0, len(sheet) - foldLine - 1):
  41. new[new_max_y - y - 1][x] = new[new_max_y - y - 1][x] or sheet[new_max_y + y + 1][x]
  42. return new
  43. for fold in folds:
  44. if fold[0] == 'x':
  45. sheet = foldX(fold[1], sheet)
  46. else:
  47. sheet = foldY(fold[1], sheet)
  48. print(sum([sum(map(int, line)) for line in sheet]))
  49. for line in sheet:
  50. print("".join(map(lambda p: "#" if p else '.', line)))