···11+import fileinput
22+from itertools import permutations
33+from collections import defaultdict
44+55+from utils import Point
66+77+88+# Parse problem input.
99+BOARD = {}
1010+ANTENNAE = defaultdict(set)
1111+for y, line in enumerate(fileinput.input()):
1212+ for x, c in enumerate(line.strip()):
1313+ p = Point(x, y)
1414+ BOARD[p] = c
1515+ if c != '.':
1616+ ANTENNAE[c].add(p)
1717+1818+# Solve problem.
1919+part_1_antinodes = set()
2020+part_2_antinodes = set()
2121+2222+for freq, locs in ANTENNAE.items():
2323+ for a, b in permutations(locs, 2):
2424+ for i in range(len(line)):
2525+ antinode = b + (b - a) * i
2626+ part_2_antinodes.add(antinode)
2727+ if i == 1:
2828+ part_1_antinodes.add(antinode)
2929+3030+print("Part 1:", len(part_1_antinodes & set(BOARD)))
3131+print("Part 2:", len(part_2_antinodes & set(BOARD)))