59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
def ptAdd(pt1,pt2):
|
|
return [pt1[0]+pt2[0],pt1[1]+pt2[1]]
|
|
|
|
def ptSub(pt1,pt2):
|
|
return [pt1[0]-pt2[0],pt1[1]-pt2[1]]
|
|
|
|
def antennae(arr):
|
|
out = {}
|
|
for i in range(0,len(arr)):
|
|
for j in range(0,len(arr[i])):
|
|
if arr[i][j] != ".":
|
|
if arr[i][j] in out:
|
|
out[arr[i][j]].append([i,j])
|
|
else:
|
|
out[arr[i][j]] = [[i,j]]
|
|
return out
|
|
|
|
def antinodes(antennae):
|
|
out = []
|
|
for a in antennae:
|
|
for i in range(0,len(antennae[a])):
|
|
for j in range(i+1,len(antennae[a])):
|
|
pt1 = antennae[a][i]
|
|
pt2 = antennae[a][j]
|
|
an1 = ptAdd(pt1,ptSub(pt1,pt2))
|
|
an2 = ptAdd(pt2,ptSub(pt2,pt1))
|
|
if an2 not in out and an2[0] >= 0 and an2[1] >= 0 and an2[0] < 50 and an2[1] < 50:
|
|
out.append(an2)
|
|
if an1 not in out and an1[0] >= 0 and an1[1] >= 0 and an1[0] < 50 and an1[1] < 50:
|
|
out.append(an1)
|
|
return out
|
|
|
|
def resonantAntinodes(antennae):
|
|
out = []
|
|
for a in antennae:
|
|
for i in range(0,len(antennae[a])):
|
|
for j in range(i+1,len(antennae[a])):
|
|
pt1 = antennae[a][i]
|
|
pt2 = antennae[a][j]
|
|
an1 = ptAdd(pt1, ptSub(pt1, pt2))
|
|
while an1[0] >= 0 and an1[1] >= 0 and an1[0] < 50 and an1[1] < 50:
|
|
if not an1 in out:
|
|
out.append(an1)
|
|
an1 = ptAdd(an1, ptSub(pt1, pt2))
|
|
an2 = ptAdd(pt2,ptSub(pt2,pt1))
|
|
while an2[0] >= 0 and an2[1] >= 0 and an2[0] < 50 and an2[1] < 50:
|
|
if not an2 in out:
|
|
out.append(an2)
|
|
an2 = ptAdd(an2, ptSub(pt2, pt1))
|
|
return out
|
|
|
|
arr = []
|
|
with open("input08.txt") as file:
|
|
for line in file:
|
|
arr.append([])
|
|
for a in line[:-1]:
|
|
arr[-1].append(a)
|
|
print(len(antinodes(antennae(arr))))
|
|
print(len(resonantAntinodes(antennae(arr)))) |