Code Aquarium

minazoko's blog -*- 水底のブログ -*-

(Clojure) 標準出力 - オンライン判定コード提出用テンプレその2

前回投稿では標準出力周りが微妙な感じで終わってしまいました。折角なのでどうすれば出力も楽になるか考えてみました。こんなテンプレになりました。

(def in-seq #(line-seq (java.io.BufferedReader. *in*)))
(def s->long #(Long/parseLong %))
(defprotocol Out (output [x]))
(extend-protocol Out
  clojure.lang.Sequential
  (output [x] (map println x))
  Object
  (output [x] (println x)))

(defn solve [lines]
  )

;;(dorun (-> (in-seq) solve output))

sequentialオブジェクトならば改行しながら要素を出力。それ以外はprintlnで単純出力をします。
問題によっては出力の型が常に一致しているとは限らないことがあります。
例えば「解があるときは列挙して、無いときは"NG"と出力」のようなケースです。
そいういう場合でもsolveはoutputのI/Fを気にすることなく解を返せるようになりました。

注意点としては「Javaのネイティブ配列は sequentialではない」ということです。解を配列で作成した場合にはsolveから返す前にseq関数適用する必要があります。 その辺りはClojureの少し分かりにくい話題になりますが、こちらなどが参考になります。
* 翻訳:"Inside Clojure's Collection Model" - 草の根Clojure日記