aoc2022/d05/README.md

32 lines
1.6 KiB
Markdown

En fait le coeur de la soluce, c'est l'utilisation de ["deque"](https://docs.python.org/3.10/library/collections.html#collections.deque).
Une deque c'est une liste (un tableau) dans laquelle tu peux ajouter des éléments à droite (append), à gauche (appendLeft) et "poper", c'est à dire récupérer en les retirant, des éléments à droite (pop) et à gauche (popLeft).
ça perment d'implementer des files (FIFO) et des piles (LIFO).
Ici, je me sers d'une deque par pile de 1 à 9. Le haute de la pile est à gauche.
Donc si je dois passer une caisse d'une pile à une autre, je "popleft" de la première, ce qui me donne une caisse, puis "appendleft" cette caisse à la seconde.
On remarque qu'en prenant les caisses une par une sur une pile, elles se retrouvent dans l'autre sens sur l'autre pile.
Dans la deuxième partie, comme la grue prend toutes les caisses d'un coup, il ne faut pas inverser le sens des caisses.
Mon astuce a été d'utiliser une deque temporaire lors de chaque transfert pour empiler depuis la pile source sur cette deque puis dépiler sur la pile cible. ça inverse deux fois le sens donc retombe sur le bon sens.
| operation | result |
| - | - |
| deque([A,B,C])| `[A, B, C]` |
| deque.append(D) | `[A, B, C, D]` |
| deque.append(E) | `[A, B, C, D, E]` |
| deque.pop() | `[A, B, C, D] -> E` |
| deque.pop() | `[A, B, C] -> D` |
| deque.pop() | `[A, B] -> C` |
| deque.appendLeft(F) | `[F, A, B]` |
| deque.appendLeft(G) | `[G, F, A, B]` |
| deque.popLeft() | `[F, A, B] -> G` |
| deque.popLeft() | `[A, B] -> F` |
| deque.popLeft() | `[B] -> A` |