プロジェクト

全般

プロフィール

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