« Scheme の do | トップページ | 「語感」って大事ですよね。 »

2008年7月 6日 (日)

"Project Euler" 始めました。

"Project Euler" を始めてみました。ちなみに "Chez Scheme" で解いてます。

まずは "Problem 1" から…

;;;
;;; Problem 1
;;;
(define problem1
  (lambda (m)
    (apply +
      (filter (lambda (n)
                (or (zero? (modulo n 3))
                    (zero? (modulo n 5))))
        (iota m)))))

解答は

(problem1 1000) -> 233168

となりました。

"filter" や "iota" は R5RS には含まれていませんが、Gauche にも含まれて
いるはずなのでそちらのオンラインマニュアルを参照してみてください。

自分で解いてみた後、他の人の解答も気になったので、ググってみたら、こん
な解答
を見つけました。

(define (p1 n)
  (define (p1-iter n)
    (cond ((= n 0) 0)
          (else (+ (if (or (= 0 (modulo n 3))
                           (= 0 (modulo n 5))) n 0)
                   (p1-iter (- n 1))))))
  (p1-iter (- n 1)))

(print (p1 1000))

たぶん、この解答を考えた方は、C などの手続き型言語を勉強してきた方なん
でしょうね。私も C → Ruby → Scheme と学んできたので、昔はこのようなルー
プの中に手続きを埋め込むようなscript を書いてました。

例えば、「Fizz-Buzz 問題」を解くときに、こんな script を書きました。

(define fizz-buzz
  (lambda ()
    (let loop ((i 1) (result '()))
      (if (> i 100)
          (reverse result)
          (let ((a (remainder i 3))
                (b (remainder i 5)))
            (cond ((and (zero? a) (zero? b))
                   (loop (+ i 1) (cons "FizzBuzz" result)))
                  ((zero? a) (loop (+ i 1) (cons "Fizz" result)))
                  ((zero? b) (loop (+ i 1) (cons "Buzz" result)))
                  (else (loop (+ i 1) (cons i result)))))))))

ところが、"「Lisp脳」の謎に迫る - Schemeプログラマの発想" を読んで、目
から鱗が落ちた気持ちがしました。最終的な解答もなんとシンプルでエレガン
トなんでしょう…。あまりにも当たり前ですが、Scheme を使うなら Scheme
の考え方で…ということですね。

Scheme を知ってから Ruby の script の書き方も変わりました。昔は "for"
や "while" を使って繰り返しを書いていましたが、今はもっぱら "each" や
"times" ばかりですね。配列の "each" なんて、ほとんど list の再帰処理そ
のまんまですからね。

« Scheme の do | トップページ | 「語感」って大事ですよね。 »

Project Euler」カテゴリの記事

Scheme」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/41757382

この記事へのトラックバック一覧です: "Project Euler" 始めました。:

« Scheme の do | トップページ | 「語感」って大事ですよね。 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ