2009-10-31 4 views

Répondre

15

Python 2, imprime une liste imbriquée 2D dans le sens horaire, à partir du coin en haut à gauche du centre:

>>> def clockwise(r): 
...  return list(r[0]) + clockwise(list(reversed(zip(*r[1:])))) if r else [] 
... 
>>> a = [ 
... [ 1, 2, 3], 
... [ 5, 6, 7], 
... [ 9, 10, 11]] 
>>> clockwise(a) 
[1, 2, 3, 7, 11, 10, 9, 5, 6] 
>>> a = [ 
... [ 1, 2, 3, 4], 
... [ 5, 6, 7, 8], 
... [ 9, 10, 11, 12], 
... [13, 14, 15, 16]] 
>>> clockwise(a) 
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10] 

Alors qu'est-ce qui se passe ici? L'argument à clockwise est un tableau à deux dimensions r. Nous voulons imprimer son contenu de gauche à droite, dans le sens des aiguilles d'une montre. Donc, si le tableau à deux dimensions n'est pas vide, alors nous pouvons imprimer son premier élément, qui est la ligne du haut. Ensuite, nous voulons imprimer les derniers éléments des lignes restantes (les chiffres sur la droite). Nous ne voulons pas nous répéter. Donc ce que nous faisons, c'est de transformer les lignes restantes de sorte que les prochains numéros à imprimer soient sur la rangée supérieure. Nous faisons cela en transposant les lignes restantes (de sorte qu'elles deviennent des colonnes), puis en les inversant.

Peut-être que l'algorithme devient plus clair si je l'écris dans Haskell:

import Data.List 

clockwise :: [[a]] -> [a] 
clockwise (x:xs) = x ++ (clockwise $ reverse $ transpose $ xs) 
clockwise _  = [] 
+1

+1, belle réponse – ChristopheD

+0

belle réponse à coup sûr! Mais je suis plus intéressé par l'approche et l'algorithme utilisés. S'il vous plaît aider. –

+0

Je vais l'expliquer en une seconde :) – Stephan202