08_antinodes.py 984 B

1234567891011121314151617181920212223242526272829303132
  1. #!/usr/bin/env python3
  2. import sys
  3. from functools import partial
  4. from itertools import chain, permutations, starmap
  5. def parse(f):
  6. antennas = {}
  7. for y, line in enumerate(f):
  8. for x, char in enumerate(line[:-1]):
  9. if char != '.':
  10. antennas.setdefault(char, []).append((x, y))
  11. return antennas, x + 1, y + 1
  12. def subtract_pairs(antennas):
  13. for locs in antennas.values():
  14. for (xa, ya), (xb, yb) in permutations(locs, 2):
  15. yield xb, yb, xb - xa, yb - ya
  16. def antinodes1(w, h, x, y, dx, dy):
  17. if 0 <= x + dx < w and 0 <= y + dy < h:
  18. yield x + dx, y + dy
  19. def antinodes2(w, h, x, y, dx, dy):
  20. while 0 <= x < w and 0 <= y < h:
  21. yield x, y
  22. x += dx
  23. y += dy
  24. antennas, w, h = parse(sys.stdin)
  25. pairs = list(subtract_pairs(antennas))
  26. print(len(set(chain.from_iterable(starmap(partial(antinodes1, w, h), pairs)))))
  27. print(len(set(chain.from_iterable(starmap(partial(antinodes2, w, h), pairs)))))