せっかくの年末なので、グングン進める。
Problem 44
いやこれ、ホント解けない。コードにエラーがある?
2000番目の五角数くらいまで試したけどダメ、それ以上だと時間的にダメ。
エラーがあるのか、オーダーを落とせていないのか、とりあえず一旦後回し。
Problem 45
キレイに書けた。
(define (trinum n) (quotient (* n (+ n 1)) 2)) (define (pennum n) (quotient (* n (- (* 3 n) 1)) 2)) (define (hexnum n) (* n (- (* 2 n) 1))) (define (same3 countend) (define (sub trii peni hexi count) (if (= count countend) (display "OK") (let ((tri (trinum trii)) (pen (pennum peni)) (hex (hexnum hexi))) (cond ((= tri pen hex) (let* ((a (display tri)) (b (newline))) (sub (+ trii 1) (+ peni 1) (+ hexi 1) (+ count 1)))) ((<= tri pen hex) (sub (+ trii 1) peni hexi count)) ((>= tri pen hex) (sub trii peni (+ hexi 1) count)) ((and (>= tri pen) (<= tri hex)) (sub trii (+ peni 1) hexi count)) ((<= tri hex) (sub (+ trii 1) peni hexi count)) (#t (sub trii peni (+ hexi 1) count)))))) (sub 1 1 1 0)) (display (same3 3)) (newline)
1,40755ときて、その次の数は結構大きくなるのね。
この書き方だと一瞬で求められた。やったね。
「Ti, Pj, Hkを保持し、一番小さいものの添え字に1を足す」というやり方でやった。
Problem 46
;二分平衡木?で素数を管理したいが組めない・・・ ;O(root(n))の素数判定 (define (sosu? n) (define (sub i) (cond ((> (* i i) n) #t) ((= (modulo n i) 0) #f) (#t (sub (+ i 1))))) (if (<= n 1) #f (sub 2))) (define (gold? n) (define (sub i) (cond ((>= (* 2 i i) n) #f) ((sosu? (- n (* 2 i i))) #t) (#t (sub (+ i 1))))) (sub 1)) (define (solve) (define (sub i) (if (and (not (sosu? i)) (not (gold? i))) i (sub (+ i 2)))) (sub 3)) (display (solve)) (newline)
Problem 44が解けなくて、それ以降の問題も構えていたものの、全然順調に解けてる。
やはり、44は何か見落としをしているのか・・・?コードか、もしくは問題の簡単化か。
44を考えながらも、モチベーション落とさぬよう進めていく。