aoc2023/d03/run2.py

51 lines
1.7 KiB
Python
Raw Permalink Normal View History

2023-12-03 13:47:21 +00:00
import sys
myList = list(list(map(str,s)) for s in sys.stdin.read().splitlines())
def if_symbol_adj(l, n, i):
for m in [n-1, n, n+1]:
if m < 0 or m > len(l)-1: continue
for j in [i-1, i, i+1]:
if j < 0 or j > len(l[m])-1: continue
if l[m][j] == "*" :
return True, m, j
else:
pass
return False, 0, 0
def gear(list_etoile, etoile_en_cours, liste_nb):
for idx in range(len(list_etoile)):
if list_etoile.count(list_etoile[idx]) == 2 and etoile_en_cours == list_etoile[idx]:
return int(liste_nb[idx])
return 0
def main(S = 0):
list_etoile = []
liste_nb = []
etoile_en_cours = [0,0]
# de haut en bas
for n in range(len(myList)):
nb = ""
if_sum = False
# de gauche à droite
for i in range(len(myList[n])):
if myList[n][i].isdigit():
nb = "".join([nb, myList[n][i]])
result, x, y = if_symbol_adj(myList, n, i)
if_sum = if_sum or result
etoile_en_cours = [max(x, etoile_en_cours[0]) , max(y, etoile_en_cours[1])]
if not myList[n][i].isdigit() or i == len(myList[n]) -1:
# soit pas encore un nombre soit la fin d'un nombre, soit la fin d'une ligne
if nb!="":
#print(nb, if_sum)
list_etoile.append((etoile_en_cours))
liste_nb.append((nb))
if if_sum: S+= (int(nb) * gear(list_etoile, etoile_en_cours, liste_nb))
if_sum = False
nb = ""
etoile_en_cours = [0,0]
return S
if __name__ == '__main__':
print(main())