• # Python

    Posté par . En réponse au message Advent of Code 2023 : Day 3. Évalué à 1. Dernière modification le 04 décembre 2023 à 20:49.

    Voici ma solution du jour :

    #!/bin/python3
    def intlen(nb):
     l = 0
     while nb >= 1:
     nb = nb / 10
     l +=1
     return l
    def ispart(puzzle,line,col,n):
     try :
     if puzzle[line][col-1].isdigit():
     return 0
     except IndexError:
     pass
     try :
     for i in range(1,5):
     if puzzle[line][col+i].isdigit():
     n = n*10 + int(puzzle[line][col+i])
     else:
     break
     except IndexError:
     pass
     for j in [1,-1]:
     for i in range(-1,intlen(n)+1):
     try :
     if puzzle[line+j][col+i].isdigit() == False and puzzle[line+j][col+i] != ".":
     return n
     except IndexError:
     pass
     for i in [-1,intlen(n)]:
     try :
     if puzzle[line][col+i].isdigit() == False and puzzle[line][col+i] != ".":
     return n
     except IndexError:
     pass
     return 0
    def isgear(puzzle,line,col,j):
     try:
     if puzzle[line][col].isdigit() == False:
     return 0
     except IndexError:
     return 0
     if j != -1:
     try:
     if puzzle[line][col-1].isdigit():
     return 0
     except IndexError:
     pass
     start = 0
     for i in range(-1,-5,-1):
     try:
     if puzzle[line][col+i].isdigit():
     start -= 1
     else:
     break
     except IndexError:
     break
     p = ispart(puzzle, line, col+start, int(puzzle[line][col+start]))
     return p
    def solve1(puzzle,testing=False):
     s=0
     for line in range(len(puzzle)):
     for col in range(len(puzzle[line])):
     if puzzle[line][col] == ".":
     continue
     elif puzzle[line][col].isdigit():
     p = ispart(puzzle,line,col,int(puzzle[line][col]))
     s += p
     if testing and p!=0:
     print("The part ", p," at ", line, ";", col, " is ok.")
     if testing:
     print(s)
     return s
    def solve2(puzzle,testing=False):
     s = 0
     for line in range(len(puzzle)):
     for col in range(len(puzzle[line])):
     if puzzle[line][col] == "*":
     ng = 0
     g = [0,0,0]
     for i in [1,0,-1]:
     for j in [1,0,-1]:
     g[ng] = isgear(puzzle,line+i,col+j,j)
     if g[ng] != 0:
     ng += 1
     if ng == 3:
     break
     if ng == 3:
     break
     if ng == 2:
     if testing:
     print("Gear at ",line,";",col," with parts ",g[0],";",g[1])
     s += g[0] * g[1]
     elif testing:
     print("Gear at ",line,";",col," but with ",ng," parts.")
     if testing:
     print(s)
     return s
    test1 ="""
    467..114..
    ...*......
    ..35..633.
    ......#...
    617*......
    .....+.58.
    ..592.....
    ......755.
    ...$.*....
    .664.598.."""
    result1 = 4361
    test2 = test1
    result2 = 467835
    def solve(short=False):
     print("----Part 1----")
     if short == False:
     if solve1(test1.split("\n"),testing=True) != result1:
     print("Not working.")
     return False
     else :
     print("Maybe working?")
     with open("input.txt",'r') as file:
     lines = file.read().split("\n")
     s1 = solve1(lines)
     print(s1)
     print("----Part 2----")
     if short == False:
     if solve2(test2.split("\n"),testing=True) != result2:
     print("Not working.")
     return False
     else :
     print("Maybe working?")
     with open("input.txt",'r') as file:
     lines = file.read().split("\n")
     s2 = solve2(lines)
     print(s2)
     return s1, s2
    if __name__ == "__main__":
     from sys import argv
     try:
     if argv[1] == "--summary" or argv[1] == "-s":
     solve(short=True)
     except IndexError:
     solve()

    J'ai passé beaucoup de temps à essayer de comprendre pourquoi diable les test fonctionnaient mais pas l'input ! La réponse était dans ma fonction pour récupérer la taille d'un entier :

    def intlen(nb):
     l = 0
     while nb > 0:
     nb = nb / 10
     l +=1
     return l

    Avec while nb > 0 au lieu de while nb >= 1. Mais les données de test fonctionnaient, c'était incompréhensible.

    Et oui, je suis un grand adepte du try ... except quand je code vite et crade.

    L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès