Arantium Maestum

プログラミング、囲碁、読書の話題

Clojure入門 - Project Eulerを解いてみる 問1

Pragmatic Programmerのアドバイス

毎年一つ新しい言語を学ぶべし

に従って、今年はClojureを勉強したい。(ちなみに去年はCをちゃんと勉強するというのが目標。ある程度は実践できた)

去年の最後の週から少しずつ文法などを見てみた。以前からSchemeについては少し触れていた(SchemeというかDr Racketだが)ので比較的楽。

mapreducefilterなどのいわゆる関数型言語的な書き方はPythonでもお馴染み。

今年の最終目標はClojureSICPを読み解いていくこと。Clojureに慣れ次第読み始めて、一年をかけて読破したい。

とりあえず手始めにProject Eulerの問題を解いていって慣れていこうと思う。Concurrencyも使ってみたい。

まず第一問

ここからネタバレ

(defn predicate [x]
    (or
        (= 0 (mod x 3))
        (= 0 (mod x 5))))

(println
    (reduce +
        (filter
            predicate
            (range 1000)))

やっていることは比較的簡単。はじめはrangeを無制限で使ってfilterしたものをtakewhileで1000以下に絞り込む方向で考えたのだが、大本を1000でくくったほうが絶対楽なことに気付いた。

ちなみにPythonで書くなら

def predicate(x):
    return x%3==0 or x%5==0
  
print(sum(filter(predicate, range(1000))))

なのでまあほぼ同じ。Peter NorvigもPythonとLispは超似てる(意訳)とおっしゃっていることだし、まあ当然といえば当然か。

今後Clojureを勉強していくにつれ、書き方が変わっていくのだろうか。是非今年の終わりあたりに見直してみたいものだ。