LoginSignup
3
2

More than 5 years have passed since last update.

Clojureの基本練習

Last updated at Posted at 2014-09-15

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で呟いたら教えていただきました.ありがとうございます.

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))

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2