• [^] # Re: En Python, modélisé

    Posté par (Mastodon) . En réponse au message Avent du Code, jour 9. Évalué à 4.

    J'espère que dans vos solutions perso, vous aurez pensé à utiliser, en arrivant à la deuxième partie, à utiliser une seule corde pour simuler les deux...

    Pas lors de la première résolution, mais après en nettoyant un peu le code oui... Comme d'hab, le problème arrivant en deux fois, on n'optimise pas dès le début pour la seconde partie :)

    Voici mon code :

    import numpy
    input = [(r[0], int(r[2:])) for r in sys.stdin]
    move = dict(
     U=(0, 1),
     D=(0, -1),
     L=(-1, 0),
     R=(1, 0),
    )
    def follow(head, tail):
     delta = head - tail
     if max(abs(delta)) <= 1: # no move
     return
     if delta[0]:
     tail[0] += 1 if delta[0] > 0 else -1
     if delta[1]:
     tail[1] += 1 if delta[1] > 0 else -1
    knots = [numpy.array((0, 0)) for _ in range(10)]
    tail1_pos = {(0, 0), }
    tail_pos = {(0, 0), }
    for dir, nb in input:
     for _ in range(nb):
     knots[0] += move[dir]
     for n in range(1, 10):
     follow(knots[n-1], knots[n])
     tail1_pos.add(tuple(knots[1]))
     tail_pos.add(tuple(knots[-1]))
    print(f"Tail positions visited : {len(tail1_pos)}")
    print(f"LongTail positions visited : {len(tail_pos)}")

    Pas trop modélisé, des vecteurs numpy juste pour avoir des simplifications comme l'addition, la soustraction ou la valeur absolue.
    J'aime bien ton import_line qui fait un unique itérateur pour chaque mouvement unitaire, c'est propre !

    Et donc :

    def input():
     move = dict(
     U=(0, 1),
     D=(0, -1),
     L=(-1, 0),
     R=(1, 0),
     )
     for line in sys.stdin:
     direction = move[line[0]]
     for _ in range(int(line[2:])):
     yield direction
    def follow(head, tail):
     delta = head - tail
     if max(abs(delta)) <= 1: # no move
     return
     if delta[0]:
     tail[0] += 1 if delta[0] > 0 else -1
     if delta[1]:
     tail[1] += 1 if delta[1] > 0 else -1
    knots = [numpy.array((0, 0)) for _ in range(10)]
    tail1_pos = {(0, 0), }
    tail_pos = {(0, 0), }
    for direction in input():
     knots[0] += direction
     for n in range(1, 10):
     follow(knots[n-1], knots[n])
     tail1_pos.add(tuple(knots[1]))
     tail_pos.add(tuple(knots[-1]))
    print(f"Tail positions visited : {len(tail1_pos)}")
    print(f"LongTail positions visited : {len(tail_pos)}")
    • Yth.