Problem 11 » 履歴 » バージョン 3
Noppi, 2024/01/02 04:49
| 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 | 3 | Noppi | (let* ([matrix-length (vector-length matrix)] |
| 88 | [max-index-i (- matrix-length 4)]) |
||
| 89 | (fold-left |
||
| 90 | (lambda (lis current-vector) |
||
| 91 | (let loop ([i 0] [result lis]) |
||
| 92 | (if (< max-index-i i) |
||
| 93 | result |
||
| 94 | (let ([num1 (vector-ref current-vector i)] |
||
| 95 | [num2 (vector-ref current-vector (+ i 1))] |
||
| 96 | [num3 (vector-ref current-vector (+ i 2))] |
||
| 97 | [num4 (vector-ref current-vector (+ i 3))]) |
||
| 98 | (loop (add1 i) (cons `(,num1 ,num2, num3, num4) result)))))) |
||
| 99 | 2 | Noppi | |
| 100 | 3 | Noppi | '() |
| 101 | (vector->list matrix)))) |
||
| 102 | |||
| 103 | 2 | Noppi | (define column-numbers |
| 104 | 3 | Noppi | (let* ([matrix-length (vector-length matrix)] |
| 105 | [max-index-i (- matrix-length 4)]) |
||
| 106 | (let loop1 ([i 0] [result '()]) |
||
| 107 | (if (< max-index-i i) |
||
| 108 | result |
||
| 109 | (let loop2 ([j 0] [result result]) |
||
| 110 | (if (<= matrix-length j) |
||
| 111 | (loop1 (add1 i) result) |
||
| 112 | (let ([num1 (vector-ref (vector-ref matrix i) j)] |
||
| 113 | [num2 (vector-ref (vector-ref matrix (+ i 1)) j)] |
||
| 114 | [num3 (vector-ref (vector-ref matrix (+ i 2)) j)] |
||
| 115 | [num4 (vector-ref (vector-ref matrix (+ i 3)) j)]) |
||
| 116 | (loop2 (add1 j) (cons `(,num1 ,num2, num3, num4) result))))))))) |
||
| 117 | 2 | Noppi | |
| 118 | 3 | Noppi | ;左下から右上 |
| 119 | 2 | Noppi | (define diagonal-numbers-1 |
| 120 | 3 | Noppi | (let* ([matrix-length (vector-length matrix)] |
| 121 | [max-index-j (- matrix-length 4)]) |
||
| 122 | 2 | Noppi | (let loop1 ([i 3] [result '()]) |
| 123 | (if (<= matrix-length i) |
||
| 124 | 3 | Noppi | result |
| 125 | (let loop2 ([j 0] [result result]) |
||
| 126 | (if (< max-index-j j) |
||
| 127 | (loop1 (add1 i) result) |
||
| 128 | (let ([num1 (vector-ref (vector-ref matrix i) j)] |
||
| 129 | [num2 (vector-ref (vector-ref matrix (- i 1)) (+ j 1))] |
||
| 130 | [num3 (vector-ref (vector-ref matrix (- i 2)) (+ j 2))] |
||
| 131 | [num4 (vector-ref (vector-ref matrix (- i 3)) (+ j 3))]) |
||
| 132 | (loop2 (add1 j) (cons `(,num1 ,num2 ,num3 ,num4) result))))))))) |
||
| 133 | 2 | Noppi | |
| 134 | |||
| 135 | 3 | Noppi | ;左上から右下 |
| 136 | 2 | Noppi | (define diagonal-numbers-2 |
| 137 | (let* ([matrix-length (vector-length matrix)] |
||
| 138 | [max-index (- matrix-length 4)]) |
||
| 139 | (let loop1 ([i 0] [result '()]) |
||
| 140 | (if (< max-index i) |
||
| 141 | 3 | Noppi | result |
| 142 | 2 | Noppi | (let loop2 ([j 0] [result result]) |
| 143 | (if (< max-index j) |
||
| 144 | (loop1 (add1 i) result) |
||
| 145 | (let ([num1 (vector-ref (vector-ref matrix i) j)] |
||
| 146 | [num2 (vector-ref (vector-ref matrix (+ i 1)) (+ j 1))] |
||
| 147 | [num3 (vector-ref (vector-ref matrix (+ i 2)) (+ j 2))] |
||
| 148 | [num4 (vector-ref (vector-ref matrix (+ i 3)) (+ j 3))]) |
||
| 149 | (loop2 (add1 j) (cons `(,num1 ,num2 ,num3 ,num4) result))))))))) |
||
| 150 | |||
| 151 | (define all-number-combinations |
||
| 152 | `( ,@row-numbers |
||
| 153 | ,@column-numbers |
||
| 154 | ,@diagonal-numbers-1 |
||
| 155 | ,@diagonal-numbers-2)) |
||
| 156 | |||
| 157 | (define product-numbers |
||
| 158 | (map |
||
| 159 | (lambda (lis) |
||
| 160 | (apply * lis)) |
||
| 161 | all-number-combinations)) |
||
| 162 | |||
| 163 | (define answer-11 |
||
| 164 | (apply max product-numbers)) |
||
| 165 | |||
| 166 | (printf "11: ~D~%" answer-11) |
||
| 167 | 1 | Noppi | ``` |