Problem 11 » 履歴 » バージョン 2
Noppi, 2023/12/29 14:03
1 | 1 | Noppi | [ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] |
---|---|---|---|
2 | # [[Problem 11]] |
||
3 | |||
4 | ## Largest Product in a Grid |
||
5 | In the $20 \times 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 <span style="color:red">**26**</span> 38 40 67 59 54 70 66 18 38 64 70 |
||
14 | 67 26 20 68 02 62 12 20 95 <span style="color:red">**63**</span> 94 39 63 08 40 91 66 49 94 21 |
||
15 | 24 55 58 05 66 73 99 26 97 17 <span style="color:red">**78**</span> 78 96 83 14 88 34 89 63 72 |
||
16 | 21 36 23 09 75 00 76 44 20 45 35 <span style="color:red">**14**</span> 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 \times 63 \times 78 \times 14 = 1788696$. |
||
29 | What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the $20 \times 20$ grid? |
||
30 | |||
31 | ## 格子内の最大の積 |
||
32 | 上の 20×20 の格子のうち, 斜めに並んだ4つの数字が赤くマークされている. |
||
33 | |||
34 | 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 |
||
35 | 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 |
||
36 | 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 |
||
37 | 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 |
||
38 | 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 |
||
39 | 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 |
||
40 | 32 98 81 28 64 23 67 10 <span style="color:red">**26**</span> 38 40 67 59 54 70 66 18 38 64 70 |
||
41 | 67 26 20 68 02 62 12 20 95 <span style="color:red">**63**</span> 94 39 63 08 40 91 66 49 94 21 |
||
42 | 24 55 58 05 66 73 99 26 97 17 <span style="color:red">**78**</span> 78 96 83 14 88 34 89 63 72 |
||
43 | 21 36 23 09 75 00 76 44 20 45 35 <span style="color:red">**14**</span> 00 61 33 97 34 31 33 95 |
||
44 | 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 |
||
45 | 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 |
||
46 | 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 |
||
47 | 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 |
||
48 | 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 |
||
49 | 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 |
||
50 | 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 |
||
51 | 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 |
||
52 | 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 |
||
53 | 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 |
||
54 | |||
55 | それらの数字の積は 26 × 63 × 78 × 14 = 1788696 となる. |
||
56 | 上の 20×20 の格子のうち, 上下左右斜めのいずれかの方向で連続する4つの数字の積のうち最大のものはいくつか? |
||
57 | |||
58 | ```scheme |
||
59 | 2 | Noppi | #!r6rs |
60 | #!chezscheme |
||
61 | |||
62 | (import (chezscheme)) |
||
63 | |||
64 | (define matrix |
||
65 | '#(#(08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08) |
||
66 | #(49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00) |
||
67 | #(81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65) |
||
68 | #(52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91) |
||
69 | #(22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80) |
||
70 | #(24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50) |
||
71 | #(32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70) |
||
72 | #(67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21) |
||
73 | #(24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72) |
||
74 | #(21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95) |
||
75 | #(78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92) |
||
76 | #(16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57) |
||
77 | #(86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58) |
||
78 | #(19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40) |
||
79 | #(04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66) |
||
80 | #(88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69) |
||
81 | #(04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36) |
||
82 | #(20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16) |
||
83 | #(20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54) |
||
84 | #(01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48))) |
||
85 | |||
86 | (define row-numbers |
||
87 | (let ([matrix-length (vector-length matrix)]) |
||
88 | (let loop1 ([i 0] [result '()]) |
||
89 | (if (<= matrix-length i) |
||
90 | (reverse result) |
||
91 | (let ([max-index-j (- matrix-length 4)]) |
||
92 | (let loop2 ([j 0] [result result]) |
||
93 | (if (< max-index-j j) |
||
94 | (loop1 (add1 i) result) |
||
95 | (let ([sub-matrix (vector-ref matrix i)]) |
||
96 | (loop2 (add1 j) (cons `( ,(vector-ref sub-matrix j) |
||
97 | ,(vector-ref sub-matrix (+ j 1)) |
||
98 | ,(vector-ref sub-matrix (+ j 2)) |
||
99 | ,(vector-ref sub-matrix (+ j 3))) |
||
100 | result)))))))))) |
||
101 | |||
102 | (define column-numbers |
||
103 | (let ([matrix-length (vector-length matrix)]) |
||
104 | (let loop1 ([j 0] [result '()]) |
||
105 | (if (<= matrix-length j) |
||
106 | (reverse result) |
||
107 | (let ([max-index-i (- matrix-length 4)]) |
||
108 | (let loop2 ([i 0] [result result]) |
||
109 | (if (< max-index-i i) |
||
110 | (loop1 (add1 j) result) |
||
111 | (let ([num1 (vector-ref (vector-ref matrix i) j)] |
||
112 | [num2 (vector-ref (vector-ref matrix (+ i 1)) j)] |
||
113 | [num3 (vector-ref (vector-ref matrix (+ i 2)) j)] |
||
114 | [num4 (vector-ref (vector-ref matrix (+ i 3)) j)]) |
||
115 | (loop2 (add1 i) (cons `(,num1 ,num2 ,num3 ,num4) result)))))))))) |
||
116 | |||
117 | ;; 左下から右上 |
||
118 | (define diagonal-numbers-1 |
||
119 | (let ([matrix-length (vector-length matrix)]) |
||
120 | (let loop1 ([i 3] [result '()]) |
||
121 | (if (<= matrix-length i) |
||
122 | (reverse result) |
||
123 | (let ([max-index-j (- matrix-length 4)]) |
||
124 | (let loop2 ([j 0] [result result]) |
||
125 | (if (< max-index-j j) |
||
126 | (loop1 (add1 i) result) |
||
127 | (let ([num1 (vector-ref (vector-ref matrix i) j)] |
||
128 | [num2 (vector-ref (vector-ref matrix (- i 1)) (+ j 1))] |
||
129 | [num3 (vector-ref (vector-ref matrix (- i 2)) (+ j 2))] |
||
130 | [num4 (vector-ref (vector-ref matrix (- i 3)) (+ j 3))]) |
||
131 | (loop2 (add1 j) (cons `(,num1 ,num2 ,num3 ,num4) result)))))))))) |
||
132 | |||
133 | |||
134 | ;; 左上から右下 |
||
135 | (define diagonal-numbers-2 |
||
136 | (let* ([matrix-length (vector-length matrix)] |
||
137 | [max-index (- matrix-length 4)]) |
||
138 | (let loop1 ([i 0] [result '()]) |
||
139 | (if (< max-index i) |
||
140 | (reverse result) |
||
141 | (let loop2 ([j 0] [result result]) |
||
142 | (if (< max-index j) |
||
143 | (loop1 (add1 i) result) |
||
144 | (let ([num1 (vector-ref (vector-ref matrix i) j)] |
||
145 | [num2 (vector-ref (vector-ref matrix (+ i 1)) (+ j 1))] |
||
146 | [num3 (vector-ref (vector-ref matrix (+ i 2)) (+ j 2))] |
||
147 | [num4 (vector-ref (vector-ref matrix (+ i 3)) (+ j 3))]) |
||
148 | (loop2 (add1 j) (cons `(,num1 ,num2 ,num3 ,num4) result))))))))) |
||
149 | |||
150 | (define all-number-combinations |
||
151 | `( ,@row-numbers |
||
152 | ,@column-numbers |
||
153 | ,@diagonal-numbers-1 |
||
154 | ,@diagonal-numbers-2)) |
||
155 | |||
156 | (define product-numbers |
||
157 | (map |
||
158 | (lambda (lis) |
||
159 | (apply * lis)) |
||
160 | all-number-combinations)) |
||
161 | |||
162 | (define answer-11 |
||
163 | (apply max product-numbers)) |
||
164 | |||
165 | (printf "11: ~D~%" answer-11) |
||
166 | 1 | Noppi | ``` |