Problem
Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows:
![]()
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
let rec sumDiagonals n m total max = match n with | 1 -> sumDiagonals (n+1) m 1 1 | _ when n > m -> total | _ when n % 2 = 0 -> sumDiagonals (n+1) m total max | _ -> let newValues = [1..4] |> List.map (fun x -> max + x * (n-1)) let newMax = newValues |> List.max let newTotal = total + (newValues |> List.sum) sumDiagonals (n+1) m newTotal newMax let answer = sumDiagonals 1 1001 0 0
As you’ve probably noticed already, there’s a pattern in the sequence 1, 3, 5, 7, 9, 13, 17, 21, 25, … generated by the spiral in the problem brief. As the dimension goes up by 2 at a time, all odd numbers, 4 new numbers are added to the sequence:
Dimension (d) | Numbers on the edge of the square | Max number from last dimension |
1 | 1 | |
3 | 3, 5, 7, 9 | 1 |
5 | 13, 17, 21, 25 | 9 |
Looking at the above table, it quickly becomes clear that the new numbers that are added to the diagonals when you expand the dimension by 2 can be calculated as:
max number from last dimension + (d-1) * i (where i is a number from 1 to 4)
My solution simply wraps this logic in a recursive function whilst keeping a running total of all the numbers that have been generated.