46 lines
1.2 KiB
Python

#!/usr/bin/env python3
# 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?
from projecteuler import timing
@timing
def p028() -> None:
N = 1001
limit = N * N
i = 0
j = 1
step = 0
_sum = 1
# Starting with the central 1, it's easy to see that the next four numbers in the diagonal
# are 1+2, 1+2+2, 1+2+2+2 and 1+2+2+2+2, then for the next four number the step is increased
# by two, so from 9 to 9+4, 9+4+4 etc, for the next four number the step is again increased
# by two, and so on. We go on until the value is equal to N*N, with N=1001 for this problem.
while j < limit:
if i == 0:
step = step + 2
j = j + step
_sum = _sum + j
i = (i + 1) % 4
print('Project Euler, Problem 28')
print(f'Answer: {_sum}')
if __name__ == '__main__':
p028()