Clojureの練習でAOJの簡単な問題を解いています.
より良い解法とかありましたら是非教えてくださいm(_ _)m
No.0000 九九を表示させるプログラム(QQ)
標準出力で以下のように出力する
1x1=1
1x2=2
.
.
.
9x8=72
9x9=81
九九の結果を出すだけならforのリスト内包表記で簡単です.
(for [x (range 1 10)
y (range 1 10)]
(* x y))
とすると
(1 2 3 4 5 6 7 8 9 2 4 6 8 ... 54 63 72 81)
みたいなリストが得られます.今回は一行ずつ改行しながら出力したいのでprintlnをつけてみます
(for [x (range 1 10)
y (range 1 10)]
(println x "x" y "=" (* x y)))
とやってみましたが,結果は
(1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
nil nil nil nil nil nil nil nil 2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
.
.
.
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72
nil nil nil nil nil nil nil nil nil 9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
nil nil nil nil nil nil nil nil nil nil)
これってprintlnが返してるnilが毎回出ちゃってるのかな?よくわからん.
nilが入らないようにする方法をTwitterで呟いたら教えていただきました.ありがとうございます.
@ayihis (println (clojure.string/join "\n" (for [x (range 1 10) y (range 1 10)] (str x "*" y "=" (* x y)))))
— か (@ka_) 2014, 9月 14
@ayihis @ka_ forの代わりにdoseqを使ってもできます (doseq [x (range 1 10), y (range 1 10)] (println x “*” y “=“ (* x y)))
— えいとす (a.k.a あちょす) (@athos0220) 2014, 9月 14
1つ目の解決策はjoinを使って改行を差し込んでいくパターン.
(println
(clojure.string/join
"\n"
(for [x (range 1 10)
y (range 1 10)]
(str x "x" y "=" (* x y)))))
2つ目の解決策はdoseqを使って繰り返し処理をするパターン
(doseq [x (range 1 10)
y (range 1 10)]
(println x "x" y "=" (* x y)))
No.0002 数列のソートと出力(List of Top 3 Hills)
標準入力から,0 <= x <= 100000の範囲の数値を10個読み込み,大きい順に3つを出力する.
# sample input
1819
2003
876
2840
1723
1673
3776
2848
1592
922
# sample output
3776
2848
2840
よくわからなかったのが,「10行読み込む」という処理をどう書くか.doseqでループを10回して(lead-line)でなんとかした.
あと,出力するときに,リストでは無く,数値を一つずつ改行して出力しなきゃいけないのは.No0000で使った手を流用.
(import java.lang.Integer)
(def input (ref ()))
(defn add-input [ipt]
(dosync (alter input conj ipt)))
(defn input-10-data []
(doseq [x (range 10)]
(add-input (Integer/parseInt (read-line)))))
(defn print-sorted-3-data []
(println
(clojure.string/join
"\n"
(take 3 (sort > (deref input))))))
(defn reset-input []
(dosync (ref-set input ())))
(defn -main [& args]
(input-10-data)
(print-sorted-3-data))