part01.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import argparse
  2. import functools
  3. from typing import NamedTuple, List, Dict, Set
  4. parser = argparse.ArgumentParser()
  5. parser.add_argument("ifile", type=argparse.FileType('r'))
  6. args = parser.parse_args()
  7. heightmap = [[int(x) for x in line.strip()] for line in args.ifile.readlines()]
  8. def printMap(map: List[List]):
  9. for line in map:
  10. print("".join([str(int(el)) for el in line]))
  11. def descendingMap(seq: int) -> List[bool]:
  12. return [True] + list(map(lambda pair: pair[0] < pair[1], zip(seq[1:], seq)))
  13. right = map(descendingMap, heightmap)
  14. left = map(lambda line: reversed(descendingMap(list(reversed(line)))), heightmap)
  15. horiz = [[all(pair) for pair in line] for line in map(lambda pair: zip(pair[0], pair[1]), zip(right, left))]
  16. # transpose array to check cols
  17. flipped = [[heightmap[j][i] for j in range(len(heightmap))] for i in range(len(heightmap[0]))]
  18. up = map(descendingMap, flipped)
  19. down = map(lambda line: reversed(descendingMap(list(reversed(line)))), flipped)
  20. pre_vert = [[all(pair) for pair in line] for line in map(lambda pair: zip(pair[0], pair[1]), zip(up, down))]
  21. # transpose back
  22. vert = [[pre_vert[j][i] for j in range(len(pre_vert))] for i in range(len(pre_vert[0]))]
  23. composite = [[all(pair) for pair in line] for line in map(lambda pair: zip(pair[0], pair[1]), zip(horiz, vert))]
  24. paired = [[pair[0] + 1 if pair[1] else 0 for pair in line] for line in map(lambda pair: zip(pair[0], pair[1]), zip(heightmap, composite))]
  25. print(sum(map(sum, paired)))