From 7660607c7cf5d041dcd2cd5f8bac4658370f8ea4 Mon Sep 17 00:00:00 2001 From: setop Date: Tue, 6 Dec 2022 15:04:45 +0100 Subject: [PATCH] day 5, explain deque --- d05/README.md | 31 +++++++++++++++++++++++++++++++ d05/part1.py | 4 ++-- d05/part2.py | 4 ++-- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 d05/README.md diff --git a/d05/README.md b/d05/README.md new file mode 100644 index 0000000..1fc626d --- /dev/null +++ b/d05/README.md @@ -0,0 +1,31 @@ +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` | + + diff --git a/d05/part1.py b/d05/part1.py index 37e74f5..015448a 100644 --- a/d05/part1.py +++ b/d05/part1.py @@ -11,8 +11,8 @@ for _ in range(8): c = line[4*j+1] if c != " ": S[j].append(c) -line = next(sys.stdin) -line = next(sys.stdin) +next(sys.stdin) +next(sys.stdin) # process while line := sys.stdin.readline(): _, q, _, f, _, t = line.strip().split(" ") diff --git a/d05/part2.py b/d05/part2.py index 5af4d1a..399ef1c 100644 --- a/d05/part2.py +++ b/d05/part2.py @@ -11,8 +11,8 @@ for _ in range(8): c = line[4*j+1] if c != " ": S[j].append(c) -line = next(sys.stdin) -line = next(sys.stdin) +next(sys.stdin) +next(sys.stdin) # process while line := sys.stdin.readline(): _, q, _, f, _, t = line.strip().split(" ")