• # Python

    Posté par . En réponse au message Advent of Code, jour 14. Évalué à 1.

    Voici ma solution, elle est rapide, mais elle m'a pris beaucoup de temps pour une et une seule raison : dans la première partie, j'ai codé une fonction qui calcule le poids si on bougeait les pierres vers le nord (en fait l'est puisque j'ai renversé le puzzle, je préfère les lignes aux colonnes).
    Dans ma deuxième partie, je me dis ; « Réutilisons gaiement cette fonction après avoir effectivement fait rouler les pierres ! » 😔

    #!/bin/python3
    from functools import cache
    def rotate90(lines):
     columns = [""]*len(lines[0])
     for i in range(len(lines[0])):
     columns[i] = "".join(reversed([ _[i] for _ in lines ]))
     return columns
    @cache
    def getWeight(rang,nb):
     return sum(range(rang-nb+1,rang+1))
    @cache
    def getLoad(line):
     count = 0
     total = 0
     for i, _ in enumerate(line):
     if _ == "#":
     total += getWeight(i,count)
     count = 0
     elif _ == "O":
     count += 1
     total += getWeight(len(line),count)
     return total
    @cache
    def getActualLoad(line):
     total = 0
     for i, _ in enumerate(line):
     if _ == "O":
     total += i+1
     return total
    @cache
    def fallLine(line):
     count = 0
     result = ""
     for i, _ in enumerate(line):
     if _ == "#":
     while len(result) < i - count:
     result += "."
     result += "O"*count + "#"
     count = 0
     elif _ == "O":
     count += 1
     while len(result) < len(line) - count :
     result += "."
     result += "O"*count
     return result
    def cycle(puzzle,step):
     if step == 0:
     return puzzle, sum([getActualLoad(_) for _ in rotate90(puzzle)])
     return cycle([fallLine(_) for _ in rotate90(puzzle)],step-1)
    def solve1(puzzle,testing=False):
     s=0
     s = sum([getLoad(_) for _ in rotate90(puzzle)])
     if testing:
     print(s)
     return s
    def solve2(puzzle,testing=False):
     s = 0
     pastresult = []
     now = puzzle
     pastresult.append(now)
     i=1
     while True:
     now, r = cycle(now,4)
     if now in pastresult:
     i = pastresult.index(now)
     tosum = ((1000000000 - i ) % (len(pastresult) - i)) + i
     s = sum([getActualLoad(_) for _ in rotate90(pastresult[tosum])])
     break
     pastresult.append(now)
     i+= 1
     if testing:
     print(s)
     return s

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