Fortran Implementation of Problem 11

View source code here on GitHub!

integer Problem0011/p0011()
 1! Project Euler Problem 11
 2!
 3! Problem:
 4!
 5! In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
 6!
 7! 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
 8! 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
 9! 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
10! 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
11! 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
12! 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
13! 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
14! 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
15! 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
16! 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
17! 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
18! 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
19! 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
20! 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
21! 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
22! 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
23! 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
24! 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
25! 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
26! 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
27!
28! The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
29!
30! What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in
31! the 20×20 grid?
32
33module Problem0011
34    use constants
35    implicit none
36contains
37    integer(i18t) function p0011() result(answer)
38        integer(i2t), dimension(20, 20) :: grid
39        integer(i18t) :: tmp
40        integer :: i, j
41
42        ! Manually initialize the grid
43        data grid / &
44            8,  2, 22, 97, 38, 15,  0, 40,  0, 75,  4,  5,  7, 78, 52, 12, 50, 77, 91,  8, &
45            49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48,  4, 56, 62,  0, &
46            81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30,  3, 49, 13, 36, 65, &
47            52, 70, 95, 23,  4, 60, 11, 42, 69, 24, 68, 56,  1, 32, 56, 71, 37,  2, 36, 91, &
48            22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80, &
49            24, 47, 32, 60, 99,  3, 45,  2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50, &
50            32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70, &
51            67, 26, 20, 68,  2, 62, 12, 20, 95, 63, 94, 39, 63,  8, 40, 91, 66, 49, 94, 21, &
52            24, 55, 58,  5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72, &
53            21, 36, 23,  9, 75,  0, 76, 44, 20, 45, 35, 14,  0, 61, 33, 97, 34, 31, 33, 95, &
54            78, 17, 53, 28, 22, 75, 31, 67, 15, 94,  3, 80,  4, 62, 16, 14,  9, 53, 56, 92, &
55            16, 39,  5, 42, 96, 35, 31, 47, 55, 58, 88, 24,  0, 17, 54, 24, 36, 29, 85, 57, &
56            86, 56,  0, 48, 35, 71, 89,  7,  5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58, &
57            19, 80, 81, 68,  5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77,  4, 89, 55, 40, &
58            4, 52,  8, 83, 97, 35, 99, 16,  7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66, &
59            88, 36, 68, 87, 57, 62, 20, 72,  3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69, &
60            4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18,  8, 46, 29, 32, 40, 62, 76, 36, &
61            20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74,  4, 36, 16, &
62            20, 73, 35, 29, 78, 31, 90,  1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57,  5, 54, &
63            1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52,  1, 89, 19, 67, 48 /
64        answer = 0
65
66        do i = 1, 20
67            do j = 1, 17
68                ! Horizontal section
69                tmp = int(grid(i, j), kind=8) * grid(i, j + 1) * grid(i, j + 2) * grid(i, j + 3)
70                answer = max(answer, tmp)
71
72                ! Vertical section
73                tmp = int(grid(j, i), kind=8) * grid(j + 1, i) * grid(j + 2, i) * grid(j + 3, i)
74                answer = max(answer, tmp)
75            end do
76        end do
77
78        do i = 1, 17
79            do j = 1, 17
80                ! Right diagonal section
81                tmp = int(grid(i, j), kind=8) * grid(i + 1, j + 1) * grid(i + 2, j + 2) * grid(i + 3, j + 3)
82                answer = max(answer, tmp)
83
84                ! Left diagonal section
85                tmp = int(grid(i, j + 3), kind=8) * grid(i + 1, j + 2) * grid(i + 2, j + 1) * grid(i + 3, j)
86                answer = max(answer, tmp)
87            end do
88        end do
89    end function p0011
90end module Problem0011

Tags: optimization