AdventOfCode/2024/08/solution.py

87 lines
2.9 KiB
Python

#!/bin/python3
import sys,time,re
from pprint import pprint
sys.path.insert(0, '../../')
from fred import list2int,get_re,nprint,lprint,grid_valid,loadFile,subTuples,addTuples,toGrid,get_value_in_direction
start_time = time.time()
input_f = 'input'
part = 2
#########################################
# #
# Part 1 #
# #
#########################################
if part == 1:
def findAntinodes(grid:list,pos:set,current_node:set):
antinodes = []
for row in range(pos[0],len(grid)):
for col in range(0,len(grid[1])):
if get_value_in_direction(grid,(row,col)) == current_node and (row,col) != pos:
dist = subTuples((row,col),pos)
add = addTuples(dist,(row,col))
sub = subTuples(pos,dist)
if grid_valid(sub[0],sub[1],grid):
antinodes.append(sub)
if grid_valid(add[0],add[1],grid):
antinodes.append(add)
return antinodes
grid = toGrid(input_f)
size = (len(grid),len(grid[0]))
antinodes = []
for row in range(0,size[0]):
for col in range(0,size[1]):
current_node = get_value_in_direction(grid,(row,col))
if current_node != '.':
antinodes += findAntinodes(grid,(row,col),current_node)
print(len(set(antinodes)))
#########################################
# #
# Part 2 #
# #
#########################################
if part == 2:
def findAntinodes(grid:list,pos:set,current_node:set):
antinodes = []
for row in range(0,len(grid)):
for col in range(0,len(grid[1])):
if get_value_in_direction(grid,(row,col)) == current_node and (row,col) != pos:
dist = subTuples((row,col),pos)
add = pos
sub = pos
while grid_valid(add[0],add[1],grid):
add = addTuples(dist,add)
if grid_valid(add[0],add[1],grid):
antinodes.append(add)
while grid_valid(sub[0],sub[1],grid):
sub = subTuples(sub,dist)
if grid_valid(sub[0],sub[1],grid):
antinodes.append(sub)
return antinodes
grid = toGrid(input_f)
size = (len(grid),len(grid[0]))
antinodes = []
for row in range(0,size[0]):
for col in range(0,size[1]):
current_node = get_value_in_direction(grid,(row,col))
if current_node != '.':
antinodes += findAntinodes(grid,(row,col),current_node)
print(len(set(antinodes)))
print("--- %s seconds ---" % (time.time() - start_time))