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