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
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.
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()
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
@trsqxyz l'a réécrit.
Recommended Posts