Wiki » 履歴 » バージョン 2
Noppi, 2023/12/27 01:27
1 | 2 | Noppi | [ホーム](https://redmine.noppi.jp) |
---|---|---|---|
2 | # [[Wiki|Project Euler]] |
||
3 | * [[Problem 1]] |
||
4 | * [[Problem 2]] |
||
5 | * [[Problem 3]] |
||
6 | * [[Problem 4]] |
||
7 | * [[Problem 5]] |
||
8 | * [[Problem 6]] |
||
9 | * [[Problem 7]] |
||
10 | * [[Problem 8]] |
||
11 | * [[Problem 9]] |
||
12 | * [[Problem 10]] |
||
13 | 1 | Redmine | |
14 | ```scheme |
||
15 | #!r6rs |
||
16 | #!chezscheme |
||
17 | |||
18 | (import (chezscheme)) |
||
19 | |||
20 | ;;; Problem 1 |
||
21 | (define (answer-1) |
||
22 | (let loop ((n 3) (sum 0)) |
||
23 | (cond |
||
24 | [(<= 1000 n) sum] |
||
25 | [(or (zero? (mod n 3)) (zero? (mod n 5))) |
||
26 | (loop (add1 n) (+ sum n))] |
||
27 | [else (loop (add1 n) sum)]))) |
||
28 | |||
29 | ;;; Problem 2 |
||
30 | (define (answer-2) |
||
31 | (let loop ((first 0) (second 1) (result 0)) |
||
32 | (let ((next (+ first second))) |
||
33 | (cond |
||
34 | [(< 4000000 next) result] |
||
35 | [(even? next) |
||
36 | (loop second next (+ result next))] |
||
37 | [else (loop second next result)])))) |
||
38 | |||
39 | ;;; Problem 3 |
||
40 | (define (answer-3) |
||
41 | (let* ((n 600851475143) |
||
42 | (check-max (isqrt n))) |
||
43 | (let loop ((current 3) (rest n) (max-prime 1)) |
||
44 | (cond |
||
45 | [(< check-max current) max-prime] |
||
46 | [(zero? (mod rest current)) |
||
47 | (loop current (div rest current) current)] |
||
48 | [else (loop (+ current 2) rest max-prime)])))) |
||
49 | |||
50 | (define (RotationNumber? num) |
||
51 | (let* ((num-string (number->string num)) |
||
52 | (str-length (string-length num-string)) |
||
53 | (count (div str-length 2))) |
||
54 | (let loop ((index 0)) |
||
55 | (cond |
||
56 | [(<= count index) #t] |
||
57 | [(equal? (string-ref num-string index) (string-ref num-string (- str-length 1 index))) |
||
58 | (loop (add1 index))] |
||
59 | [else #f])))) |
||
60 | |||
61 | ;;; Problem 4 |
||
62 | (define (answer-4) |
||
63 | (let loop1 ((num1 100) |
||
64 | (result 0)) |
||
65 | (if (< 999 num1) |
||
66 | result |
||
67 | (let loop2 ((num2 100) |
||
68 | (result result)) |
||
69 | (if (< 999 num2) |
||
70 | (loop1 (add1 num1) result) |
||
71 | (let ((num (* num1 num2))) |
||
72 | (if (RotationNumber? num) |
||
73 | (loop2 (add1 num2) (max result num)) |
||
74 | (loop2 (add1 num2) result)))))))) |
||
75 | |||
76 | ;;; Problem 5 |
||
77 | (define (answer-5) |
||
78 | (let ((n (* 11 13 15 16 17 19))) |
||
79 | (let loop ((i n)) |
||
80 | (if (and |
||
81 | (zero? (mod i 12)) |
||
82 | (zero? (mod i 14)) |
||
83 | (zero? (mod i 18)) |
||
84 | (zero? (mod i 20))) |
||
85 | i |
||
86 | (loop (+ i n)))))) |
||
87 | |||
88 | ;;; Problem 6 |
||
89 | (define (answer-6) |
||
90 | (let loop ((n 1) (sum-all 0) (squared-all 0)) |
||
91 | (if (< 100 n) |
||
92 | (- (expt sum-all 2) squared-all) |
||
93 | (loop (add1 n) (+ sum-all n) (+ squared-all (expt n 2)))))) |
||
94 | |||
95 | (define (prime? num) |
||
96 | (if (even? num) |
||
97 | #f |
||
98 | (let ((count (isqrt num))) |
||
99 | (let loop ((check-num 3)) |
||
100 | (cond |
||
101 | [(< count check-num) #t] |
||
102 | [(zero? (mod num check-num)) #f] |
||
103 | [else (loop (+ check-num 2))]))))) |
||
104 | |||
105 | ;;; Problem 7 |
||
106 | (define (answer-7) |
||
107 | (let loop ((current 3) (count 1) (prime 2)) |
||
108 | (if |
||
109 | (= 10001 count) |
||
110 | prime |
||
111 | (let ((next (+ current 2))) |
||
112 | (if (prime? current) |
||
113 | (loop next (add1 count) current) |
||
114 | (loop next count prime)))))) |
||
115 | |||
116 | (define (Problem8-number-string) |
||
117 | (string-append "73167176531330624919225119674426574742355349194934" |
||
118 | "96983520312774506326239578318016984801869478851843" |
||
119 | "85861560789112949495459501737958331952853208805511" |
||
120 | "12540698747158523863050715693290963295227443043557" |
||
121 | "66896648950445244523161731856403098711121722383113" |
||
122 | "62229893423380308135336276614282806444486645238749" |
||
123 | "30358907296290491560440772390713810515859307960866" |
||
124 | "70172427121883998797908792274921901699720888093776" |
||
125 | "65727333001053367881220235421809751254540594752243" |
||
126 | "52584907711670556013604839586446706324415722155397" |
||
127 | "53697817977846174064955149290862569321978468622482" |
||
128 | "83972241375657056057490261407972968652414535100474" |
||
129 | "82166370484403199890008895243450658541227588666881" |
||
130 | "16427171479924442928230863465674813919123162824586" |
||
131 | "17866458359124566529476545682848912883142607690042" |
||
132 | "24219022671055626321111109370544217506941658960408" |
||
133 | "07198403850962455444362981230987879927244284909188" |
||
134 | "84580156166097919133875499200524063689912560717606" |
||
135 | "05886116467109405077541002256983155200055935729725" |
||
136 | "71636269561882670428252483600823257530420752963450")) |
||
137 | |||
138 | ;;; Problem 8 |
||
139 | (define (answer-8) |
||
140 | (let* ((p8-num-string (Problem8-number-string)) |
||
141 | (count (- (string-length p8-num-string) 13))) |
||
142 | (let loop ((index 0) (max-num 0)) |
||
143 | (if (< count index) |
||
144 | max-num |
||
145 | (let* ((sub-num (substring p8-num-string index (+ index 13))) |
||
146 | (char-lis (string->list sub-num)) |
||
147 | (num-lis (map |
||
148 | (lambda (char) |
||
149 | (- (char->integer char) |
||
150 | (char->integer #\0))) |
||
151 | char-lis)) |
||
152 | (product-num (fold-left * 1 num-lis))) |
||
153 | (loop (add1 index) (max max-num product-num))))))) |
||
154 | |||
155 | ;;; Problem 9 |
||
156 | (define (answer-9) |
||
157 | (let loop1 ((a 1)) |
||
158 | (if (< 333 a) |
||
159 | (error "answer-9" "answer-9 was not found!") |
||
160 | (let loop2 ((b a)) |
||
161 | (if (< 499 b) |
||
162 | (loop1 (add1 a)) |
||
163 | (let ((c (- 1000 a b))) |
||
164 | (if (= (+ (expt a 2) (expt b 2)) (expt c 2)) |
||
165 | (* a b c) |
||
166 | (loop2 (add1 b))))))))) |
||
167 | |||
168 | ;;; Problem 10 |
||
169 | (define (answer-10) |
||
170 | (let ((table (make-vector 2000001 #t)) |
||
171 | (count (isqrt 2000000))) |
||
172 | (vector-set! table 0 #f) |
||
173 | (vector-set! table 1 #f) |
||
174 | |||
175 | (let loop1 ((index 2)) |
||
176 | (cond |
||
177 | [(< count index) |
||
178 | (let loop2 ((index 0) (result 0)) |
||
179 | (cond |
||
180 | [(< 2000000 index) result] |
||
181 | [(vector-ref table index) |
||
182 | (loop2 (add1 index) (+ result index))] |
||
183 | [else (loop2 (add1 index) result)]))] |
||
184 | [(vector-ref table index) |
||
185 | (let loop3 ((current (* index 2))) |
||
186 | (cond |
||
187 | [(< 2000000 current) |
||
188 | (loop1 (add1 index))] |
||
189 | [else |
||
190 | (vector-set! table current #f) |
||
191 | (loop3 (+ current index))]))] |
||
192 | [else (loop1 (add1 index))])))) |
||
193 | |||
194 | ;(printf "1: ~D~%" (answer-1)) |
||
195 | ;(printf "2: ~D~%" (answer-2)) |
||
196 | ;(printf "3: ~D~%" (answer-3)) |
||
197 | ;(printf "4: ~D~%" (answer-4)) |
||
198 | ;(printf "5: ~D~%" (answer-5)) |
||
199 | ;(printf "6: ~D~%" (answer-6)) |
||
200 | ;(printf "7: ~D~%" (answer-7)) |
||
201 | ;(printf "8: ~D~%" (answer-8)) |
||
202 | ;(printf "9: ~D~%" (answer-9)) |
||
203 | (printf "10: ~D~%" (answer-10)) |
||
204 | ``` |