Disposez les nombres en forme de spirale

C'est un programme qui organise les valeurs numériques en forme de spirale comme indiqué ci-dessous.

25 10 11 12 13
24  9  2  3 14
23  8  1  4 15
22  7  6  5 16
21 20 19 18 17

Politique de création

J'ai placé 1 au centre et ai fait un tour autour de lui pour placer les nombres.

Première place 1 au centre.

1

↓ Ensuite, faites un pas au-dessus de 1.

2
1

↓ Faites un tour complet dans le sens des aiguilles d'une montre.

2 3
1

↓ Descendre

2 3
1 4
  5

↓ Aller à gauche

  2 3
  1 4
7 6 5

↓ Monter

9 2 3
8 1 4
7 6 5

Répétez les étapes ci-dessus pour la taille spécifiée.

programme

Script Python.

spiral.py


# coding: utf-8

import itertools

#Disposez les nombres en forme de spirale
#
#Exemple)
# 10 11 12 13
#  9  2  3 14
#  8  1  4 15
#  7  6  5

def spiral(n):
    N = (-1,  0)
    E = ( 0,  1)
    S = ( 1,  0)
    W = ( 0, -1)

    def advance(p, d):
        return p[0] + d[0], p[1] + d[1]

    path = [(0, 0)]
    for size in itertools.count(3, 2):
        if len(path) >= n: break

        p = path[-1]
        p = advance(path[-1], N) #Faites un pas en avant
        path.append(p)

        #Faire un tour complet dans le sens des aiguilles d'une montre
        for d in [E, S, W, N]:
            step = size-2 if d == E else size-1
            for _ in range(step):
                p = advance(p, d)
                path.append(p)

    display(path[:n])

def display(path):
    m = { path[i] : i+1 for i in range(len(path)) }
    rs = [p[0] for p in m]
    cs = [p[1] for p in m]

    minrow, maxrow = min(rs), max(rs)
    mincol, maxcol = min(cs), max(cs)
    fmt = '%%%ds' % len(str(len(path)))
    for r in range(minrow, maxrow+1):
        for c in range(mincol, maxcol+1):
            if c > mincol:
                print(' ', end='')
            x = m[r, c] if (r, c) in m else ' '
            print(fmt % x, end='')
        print()

def main():
    while True:
        s = input("size> ")
        spiral(int(s))

if __name__ == '__main__':
    main()

Résultat d'exécution

C'est le résultat de l'exécution. taille> est l'invite. Si vous spécifiez une valeur numérique, ce nombre sera organisé en forme de spirale.

size> 9
9 2 3
8 1 4
7 6 5
size> 25
25 10 11 12 13
24  9  2  3 14
23  8  1  4 15
22  7  6  5 16
21 20 19 18 17
size> 38
26 27 28 29 30 31
25 10 11 12 13 32
24  9  2  3 14 33
23  8  1  4 15 34
22  7  6  5 16 35
21 20 19 18 17 36
            38 37

environnement

Postscript

@trsqxyz l'a réécrit.

Recommended Posts

Disposez les nombres en forme de spirale
Y a-t-il un biais dans les nombres qui apparaissent dans les nombres de Fibonacci?
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Ecrire le test dans la docstring python
Changer la liste dans l'instruction for
Exécuter l'interpréteur Python dans le script
[Python] Récupérez les fichiers dans le dossier avec Python
Utilisez le dernier pip dans un environnement virtualenv
Récupérer l'appelant d'une fonction en Python
Copiez la liste en Python
Trouvez le nombre de jours dans un mois
Obtenir uniquement les éléments de sous-classe dans une liste
Déterminez les nombres dans l'image prise avec la webcam
Vous marchez en spirale dans un monde où les murs de la croix s'élèvent (simulation)
Définir une adresse IP fixe dans l'environnement Linux
Sortie sous la forme d'un tableau python
Comment compter les nombres dans une plage spécifique
CCC: cours intensif de codage (4) Transformez les nombres apparaissant dans le rapport de circonférence 3.141562 .... dans un histogramme
Vérifiez si la chaîne est un nombre en python
Obtenir le nom de fichier dans un dossier à l'aide de glob
Enregistrer une tâche dans cron pour la première fois
Ecrire un histogramme à l'échelle logarithmique sur l'axe des x en python
Que signifie le dernier () dans une fonction en Python?
Forme du clip dans reportlab
dict in dict Transforme un dict en dict
Définir une tâche pour définir l'environnement de fabric dans YAML
[Sublime Text 2] Toujours exécuter un fichier spécifique dans le projet
Remarque sur le comportement par défaut de collate_fn dans PyTorch
Enregistrez le modèle pystan et les résultats dans un fichier pickle
Un mémorandum pour enregistrer la bibliothèque écrit en Hy dans PyPI
Découvrez la largeur apparente d'une chaîne en python
J'ai essayé l'algorithme de super résolution "PULSE" dans un environnement Windows
Créer une portée locale en Python sans polluer l'espace de noms
Comment utiliser la méthode __call__ dans la classe Python
Changer la destination de sortie standard en un fichier en Python
Remarque 2 pour intégrer le langage de script dans un script bash
Combinez des listes dans un DataFrame avec des pandas
Comment générer une requête à l'aide de l'opérateur IN dans Django
[Note] Importation de fichiers dans le répertoire parent en Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Créer une nouvelle liste en combinant des éléments en double dans la liste
Trouver les valeurs propres d'une vraie matrice symétrique en Python
[Golang] Un programme qui détermine le tour avec des nombres aléatoires
J'ai écrit un script qui divise l'image en deux
Y a-t-il un secret dans la fréquence des nombres de rapport de circonférence?