[PYTHON] Ordnen Sie die Zahlen spiralförmig an

Es ist ein Programm, das numerische Werte wie unten gezeigt spiralförmig anordnet.

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

Erstellungsrichtlinie

Ich habe 1 in die Mitte gelegt und eine Runde darum gemacht, um die Zahlen zu platzieren.

Erster Platz 1 in der Mitte.

1

↓ Machen Sie als nächstes einen Schritt über 1.

2
1

↓ Machen Sie eine volle Umdrehung im Uhrzeigersinn.

2 3
1

↓ Geh runter

2 3
1 4
  5

↓ Gehe nach links

  2 3
  1 4
7 6 5

↓ Geh hoch

9 2 3
8 1 4
7 6 5

Wiederholen Sie die obigen Schritte für die angegebene Größe.

Programm

Python-Skript.

spiral.py


# coding: utf-8

import itertools

#Ordnen Sie die Zahlen spiralförmig an
#
#Beispiel)
# 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) #Machen Sie einen Schritt nach oben
        path.append(p)

        #Machen Sie eine volle Umdrehung im Uhrzeigersinn
        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()

Ausführungsergebnis

Dies ist das Ausführungsergebnis. size> ist die Eingabeaufforderung. Wenn Sie einen numerischen Wert angeben, wird diese Zahl spiralförmig angeordnet.

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

Umgebung

Nachtrag

@trsqxyz hat es umgeschrieben.

Recommended Posts

Ordnen Sie die Zahlen spiralförmig an
Gibt es eine Verzerrung in den Zahlen, die in den Fibonacci-Zahlen erscheinen?
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Ändern Sie die Liste in der for-Anweisung
Führen Sie den Python-Interpreter im Skript aus
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Verwenden Sie den neuesten Pip in einer virtuellen Umgebung
Holen Sie sich den Aufrufer einer Funktion in Python
Kopieren Sie die Liste in Python
Finden Sie die Anzahl der Tage in einem Monat
Holen Sie sich nur Unterklassenelemente in eine Liste
Bestimmen Sie die Zahlen in dem mit der Webkamera aufgenommenen Bild
Sie wandeln spiralförmig in einer Welt, in der sich die Wände des Kreuzes erheben (Simulation)
Legen Sie eine feste IP in der Linux-Umgebung fest
Ausgabe in Form eines Python-Arrays
So zählen Sie Zahlen in einem bestimmten Bereich
CCC: Coding Crash Course (4) Machen Sie die Zahlen im Umfangsverhältnis 3.141562 .... zu einem Histogramm
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
Abrufen des Dateinamens in einem Ordner mithilfe von glob
Registrieren Sie zum ersten Mal eine Aufgabe in cron
Schreiben Sie in Python ein logarithmisches Histogramm auf die x-Achse
Was bedeutet das letzte () in einer Funktion in Python?
Clipform im Reportlab
diktieren in diktieren Macht ein Diktat ein Diktat
Definieren Sie eine Aufgabe zum Festlegen der Fabric-Umgebung in YAML
[Sublime Text 2] Führen Sie immer eine bestimmte Datei im Projekt aus
Hinweis zum Standardverhalten von collate_fn in PyTorch
Speichern Sie das Pystan-Modell und erhalten Sie eine Pickle-Datei
Ein Memorandum zur Registrierung der in Hy in PyPI geschriebenen Bibliothek
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Ich habe den Super-Resolution-Algorithmus "PULSE" in einer Windows-Umgebung ausprobiert
Erstellen Sie einen lokalen Bereich in Python, ohne den Namespace zu verschmutzen
Verwendung der Methode __call__ in der Python-Klasse
Ändern Sie das Standardausgabeziel in eine Datei in Python
Hinweis 2 zum Einbetten der Skriptsprache in ein Bash-Skript
Kombinieren Sie Listen zu einem DataFrame mit Pandas
So generieren Sie eine Abfrage mit dem IN-Operator in Django
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Erstellen Sie eine neue Liste, indem Sie doppelte Elemente in der Liste kombinieren
Finden Sie die Eigenwerte einer reellen symmetrischen Matrix in Python
[Golang] Ein Programm, das die Runde mit Zufallszahlen bestimmt
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Gibt es ein Geheimnis in der Häufigkeit der Umfangszahlen?