Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Clojureの基本練習

More than 5 years have passed since last update.

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

ayihis@github
超絶見習い情報系学生. 僕みたいなLinuxと出会ったばっかりのような初心者がつまずく内容を備忘録的な感じで情報共有したいです
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away