• # Encore des maths, du Python et de la POO

    Posté par . En réponse au message Advent of Code 2023, day 8. Évalué à 1.

    Ma solution aurait pu être mieux optimisée pour la lisibilité et la redondance, mais elle fonctionne. Je définis une classe pour les nœuds, surcharge quelques opérateurs, prétraite quelques données, et trouve le ppcm en utilisant le module math de Python.

    #!/bin/python3
    from math import lcm
    class Nodon:
     def __init__(self,name,left,right):
     self.name = name
     self.right = right
     self.left = left
     def __repr__(self):
     return self.name
     def __eq__(self,stringnode):
     if self.name == stringnode:
     return True
     return False
     def endswith(self,letter):
     if self.name[2] == letter:
     return True
     return False
     def go(self,direction):
     if direction == "R":
     return self.right
     if direction == "L":
     return self.left
     raise ValueError
    def parse_node(puzzle):
     direction = puzzle[0]
     nodes = []
     for line in puzzle[1:]:
     if line == "":
     continue
     nodes.append(Nodon(line[:3],line[7:10],line[12:15]))
     return direction, nodes
    def run(direction, nodes):
     now = nodes[nodes.index("AAA")]
     nb = 0
     while now != "ZZZ":
     for d in direction:
     now = now.go(d)
     nb += 1
     if now == "ZZZ":
     break
     return nb
    def nodesendswith(nodes, l):
     for n in nodes:
     if n.endswith(l) == False:
     return False
     return True
    def beforerun(nodes):
     for n in nodes:
     n.right = nodes[nodes.index(n.right)]
     n.left = nodes[nodes.index(n.left)]
     return nodes
    def runboth(direction, nodes):
     now = []
     for n in nodes:
     if n.endswith("A"):
     now.append(n)
     nb = 0
     ends = []
     while len(now) != 0:
     for d in direction:
     nb += 1
     for i in range(len(now)):
     now[i] = now[i].go(d)
     if now[i].endswith("Z"):
     ends.append(nb)
     now[i] = None
     for i in range(now.count(None)):
     now.remove(None)
     if len(now) == 0:
     break
     return lcm(*ends)
    def solve1(puzzle,testing=False):
     s=0
     d, nodes = parse_node(puzzle)
     s = run(d, tuple(beforerun(nodes)))
     if testing:
     print(s)
     return s
    def solve2(puzzle,testing=False):
     s = 0
     d, nodes = parse_node(puzzle)
     s = runboth(d, tuple(beforerun(nodes)))
     if testing:
     print(s)
     return s
    test1 = """RL
    AAA = (BBB, CCC)
    BBB = (DDD, EEE)
    CCC = (ZZZ, GGG)
    DDD = (DDD, DDD)
    EEE = (EEE, EEE)
    GGG = (GGG, GGG)
    ZZZ = (ZZZ, ZZZ)
    """
    result1 = 2
    test2 = """LR
    11A = (11B, XXX)
    11B = (XXX, 11Z)
    11Z = (11B, XXX)
    22A = (22B, XXX)
    22B = (22C, 22C)
    22C = (22Z, 22Z)
    22Z = (22B, 22B)
    XXX = (XXX, XXX)
    """
    result2 = 6
    # for cli invocation
    def solve(short=False,one=True,two=True):
     s1, s2 = False , False
     if one:
     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)
     if two:
     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
     s = False
     one = True
     two = True
     if len(argv) >= 2:
     if "-s" in argv or "--summary" in argv or "--short" in argv:
     s = True
     if "1" in argv:
     two = False
     one = True
     elif "2" in argv:
     one = False
     two = True
     if "2" in argv:
     two = True
     solve(short=s,one=one,two=two)

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