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 | ``` |