Problem 28 : Number spiral diagonals
Problem Statement
Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows:
\[\\ 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\]It can be verified that the sum of the numbers on the diagonals is 101.
What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way?
Solution
def printSpiral(n) :
val=[]
for i in range(0, n) :
for j in range(0, n) :
x = min(min(i, j), min(n - 1 - i, n - 1 - j))
if (i <= j) :
q=(n - 2 * x) * (n - 2 * x) - (i - x)- (j - x)
val.append(q)
else :
q=((n - 2 * x - 2) *
(n - 2 * x - 2) +
(i - x) + (j - x))
val.append(q)
return val
n = 1001
final=[]
sum1=0
sum2=0
j=0
val=[]
val = printSpiral(n)
for i in range(0,len(val),n):
final.append(val[i:i+n][::-1])
for i in range(len(final)):
sum1+=final[i][i]
for i in range(len(final)):
sum2+=final[i][len(final[i])-j-1]
j=j+1
print(sum1+sum2-final[len(final)//2][len(final[0])//2])
Output
669171001