[PYTHON] Projet Euler 28 Proposition de réponse inefficace Créer des "numéros en spirale"

problème

À partir de 1, allez à droite et augmentez le nombre dans le sens des aiguilles d'une montre, et une spirale 5 × 5 est générée comme suit:

21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 Il est confirmé que la somme des nombres sur les deux diagonales est de 101.

Lorsque vous générez une spirale 1001 × 1001 de la même manière, quelle est la somme des nombres sur la diagonale?

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2028

Répondre

Le problème qui a brûlé après une longue période. n2 + an + b Bien qu'il soit possible de répondre en l'appliquant à une formule typique, j'ai décidé de créer un "nombre en spirale" de manière inefficace.

Les nombres disposés en spirale sont fabriqués selon les règles suivantes. ・ Si le mouvement précédent était vers le haut ... Si la droite est ouverte, la droite, si la droite n'est pas ouverte, la partie supérieure ・ Si le mouvement précédent était vers le bas ... Si la gauche est ouverte, la gauche, si la gauche n'est pas ouverte, le bas ・ Si le mouvement précédent était à droite ... Si le fond est ouvert, le fond est ouvert, si le fond n'est pas ouvert, la droite ・ Si le mouvement précédent était vers la gauche ... Si le haut est ouvert, le haut est vers le haut, si le haut n'est pas ouvert, la gauche

Après cela, vous pouvez mettre cette règle dans le code et reproduire le nombre disposé en spirale. Reste-t-il quelque chose à faire, comme faire du traitement des diplômes une fonction?

UPPER = 'upper'
UNDER = 'under'
RIGHT = 'right'
LEFT  = 'left'

def nextupper(domain,i,j):
  return (UPPER,i-1,j)
  
def nextunder(domain,i,j):
  return (UNDER,i+1,j)

def nextright(domain,i,j):
  return (RIGHT,i,j+1)
  
def nextleft(domain,i,j):
  return (LEFT,i,j-1)
  
def nowupper(domain,i,j):
  if domain[i][j+1]:
    return nextupper(domain,i,j)
  else:
    return nextright(domain,i,j)

def nowunder(domain,i,j):
  if domain[i][j-1]:
    return nextunder(domain,i,j)
  else:
    return nextleft(domain,i,j)

def nowright(domain,i,j):
  if domain[i+1][j]:
    return nextright(domain,i,j)
  else:
    return nextunder(domain,i,j)

def nowleft(domain,i,j):
  if domain[i-1][j]:
    return nextleft(domain,i,j)
  else:
    return nextupper(domain,i,j)

def next(domain,drct, i, j):
  if drct == UPPER:
    return nowupper(domain,i,j)
  elif drct == UNDER:
    return nowunder(domain,i,j)
  elif drct == RIGHT:
    return nowright(domain,i,j)
  else:
    return nowleft(domain,i,j)
  
def cof():
  #MAX = 5
  MAX = 1001
  START = MAX//2
  seq = range(MAX)
  
  domain = [[0 for i in seq] for j in seq]
  v = 1
  (drct, i, j) = (UPPER,START,START)
  while i < MAX and j < MAX:
    domain[i][j] = v
    (drct, i, j) = next(domain, drct, i, j)
    v += 1
    
  #for i in seq: print domain[i]
  
  ans = 0
  for m in seq:
    ans += domain[m][m]
  for m in seq:
    ans += domain[m][MAX-m-1]
  ans -= domain[START][START]
  print ans
  
cof()

Recommended Posts

Projet Euler 28 Proposition de réponse inefficace Créer des "numéros en spirale"
Projet Euler 10 "Somme des nombres premiers"
Projet Euler 37
Projet Euler 7
Projet Euler 47
Projet Euler 31
Projet Euler 4
Projet Euler 17
Projet Euler 26
Projet Euler 8
Projet Euler 23
Projet Euler 19
Projet Euler 50
Projet Euler 42
Projet Euler 33
Projet Euler 32
Projet Euler 43
Projet Euler 35
Projet Euler 36
Projet Euler 24
Projet Euler 46
Projet Euler 48
Projet Euler 45
Projet Euler 6
Projet Euler 44
Projet Euler 39
Projet Euler 40
Projet Euler 49
Projet Euler 29
Projet Euler 27
Projet Euler 41
Projet Euler 18
Projet Euler 13
Projet Euler 30
Projet Euler 16
Projet Euler # 2 "Even Fibonacci Number" en Python
Projet Euler 14
Projet Euler 34
Projet Euler 25
Projet Euler # 10 "somme des nombres premiers" en Python
Projet Euler # 13 "Somme des grands nombres" en Python
[Projet Euler] problème1