プログラミングを上達させたい

情報学専攻の大学院→放送局でCMの営業など@大阪→舞台俳優&IT営業@東京

Project Euler(with Scheme) Problem 45〜46(44が解けない・・・)

せっかくの年末なので、グングン進める。

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を考えながらも、モチベーション落とさぬよう進めていく。