Problem 10 » 履歴 » バージョン 2
Noppi, 2023/12/27 02:26
| 1 | 1 | Noppi | [ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] |
|---|---|---|---|
| 2 | # [[Problem 10]] |
||
| 3 | |||
| 4 | ```scheme |
||
| 5 | #!r6rs |
||
| 6 | #!chezscheme |
||
| 7 | |||
| 8 | (import (chezscheme)) |
||
| 9 | |||
| 10 | 2 | Noppi | (define (sum-prime prime?-table) |
| 11 | (let* ((len (vector-length prime?-table)) |
||
| 12 | (index-list (iota len)) |
||
| 13 | (prime?-list (vector->list prime?-table))) |
||
| 14 | (fold-left |
||
| 15 | (lambda (sum index prime?) |
||
| 16 | (if prime? |
||
| 17 | (+ sum index) |
||
| 18 | sum)) |
||
| 19 | 0 |
||
| 20 | index-list |
||
| 21 | prime?-list))) |
||
| 22 | |||
| 23 | 1 | Noppi | (define answer-10 |
| 24 | (let ((table (make-vector 2000001 #t)) |
||
| 25 | (count (isqrt 2000000))) |
||
| 26 | (vector-set! table 0 #f) |
||
| 27 | (vector-set! table 1 #f) |
||
| 28 | |||
| 29 | (let loop1 ((index 2)) |
||
| 30 | (cond |
||
| 31 | 2 | Noppi | [(< count index) (sum-prime table)] |
| 32 | 1 | Noppi | [(vector-ref table index) |
| 33 | 2 | Noppi | (let loop2 ((current (* index 2))) |
| 34 | 1 | Noppi | (cond |
| 35 | [(< 2000000 current) |
||
| 36 | (loop1 (add1 index))] |
||
| 37 | [else |
||
| 38 | (vector-set! table current #f) |
||
| 39 | 2 | Noppi | (loop2 (+ current index))]))] |
| 40 | 1 | Noppi | [else (loop1 (add1 index))])))) |
| 41 | |||
| 42 | (printf "10: ~D~%" answer-10) |
||
| 43 | ``` |