2010年10月19日火曜日

プログラミングコンテストチャレンジブックをClojureで解く(1)

「プログラミングコンテストチャレンジブック」の解法はC++で記述されていますが、Clojureの練習を兼ねてこれをClojureで解いて行こうと思います。

まず、C++の手続きをそのままClojureで翻訳しようと試みました。
;; Problem 1
;; 問題 1 (悪い例)
(defn solve [m cards]
  (doseq [a cards]
    (doseq [b cards]
      (doseq [c cards]
 (doseq [d cards]
   (if (= (+ a b c d))
     "Yes"
     "No"))))))

;; テスト
(solve 9 '(1 3 5))
(solve 10 '(1 3 5))

C++コードと同様、単純な4重ループですね。

しかし、これはうまくいきません。なぜなら、doseq の戻り値は nil であり、doseq 自体が手続き型言語のように副作用のある処理を行うものだからです。

そこで、発想を変え、「結果を出すために、どういうリストが必要なのか」という視点で考えてみると、以下のようになりました。

;; 問題 1
(defn solve [m cards]
  (let [p (for [a cards b cards c cards d cards] (list a b c d))]
       (let [m-list (filter (fn [l] (= (apply + l) m)) p)]
  (if (= (count m-list) 0))
  "Yes"
  "No")))

;; テスト
(solve 9 '(1 3 5)); => "No"
(solve 10 '(1 3 5)); => "Yes"

「プログラミングコンテストチャレンジブック」には、この問題にはさらに効率的な解法が存在するということで、これも後日Clojureで解いてみたいと思います。

2010年10月16日土曜日

「Lisp脳」勉強会

10月29日に「Lisp脳」勉強会が開催されるそうです。

第5回ありえるえりあ勉強会 〜「Lisp脳」勉強会 〜

Clojureそのものの勉強会ではないですが、ClojureはLispの一種につき要注目ということでご紹介。

アリエルネットワーク&ワークスアプリケーションズ presents

至高の言語として確固たる地位を築いているプログラミング言語「Lisp」
その使い手たる達人Lisper達は何を考え、また何を求めLispを使っているのでしょうか?
今回はそんなLispの達人達を三名お呼びして、「Lisp脳」について勉強したいと思います。

このような勉強会を無料で開催してくださる太っ腹なアリエルさんに感謝です。

Scheme脳やObject脳、関数脳なら聞いたことありますが、「Lisp脳」は初耳です。たぶん、Clojure脳なんてのもあるのでしょう。

Clojureのドキュメントサイト

まだアルファ版のようですが、いつの間にかClojureのドキュメントをまとめたサイトができていました。


ClojureDocs (alpha)
http://clojuredocs.org/

サイトの紹介文によると
ClojureDocs is a community powered documentation and examples repository for the Clojure programming language.
The site is currently in alpha and we need your help to make it a great community resource, so please let us know if you've got any feedback on how to make this site better.
とのこと。みんなで共同編集するスタイルですね。

Clojureのドキュメントコメントだけでなく、豊富な使用例も掲載されているので「この関数ってどう使うんだっけな?」という時、パッと用例を引けて重宝します。

また、画面右上の検索ボックスに文字を入力すると、インクリメンタル検索でリアルタイムに検索結果(関数/変数等の一覧)が表示されます(前方一致検索)。

Clojureには (doc 関数名) でドキュメントコメントを読める機能が備わっていますが、ぶらりとClojureの世界を探検するのに使うのにも良さそうです。