Open3
Codewars 演習記録 in Clojure
はじめに
(Reserved)
<8 kyu> Function 2 - squaring an argument
与えられた引数
n
を2乗して返す関数を実装せよ。
Clojure がポーランド記法をとることに気をつける。
解答例
(defn square [n]
(* n n)
)
<7 kyu> Waiting room
題意要約:
ある待合室には 1 から n までの番号が振られた n 脚の椅子が置かれていて、利用者は以下のルールに従って順番に席に座っていく。
- 既に座っている人からなるべく距離(間隔)の空いた椅子に座る
- 他の人との間隔が同じ席が複数ある場合、その中で入り口に近い(=番号の若い)椅子に座る
椅子の数
n
(> 2) を引数として、この待合室が満席となるときに最後に埋まる席番号を返す関数last-chair
を実装せよ。
Rust と Haskell で解答済みなので、求める計算結果は分かっている。さて、Clojure ではどう書ける?
解答例1(引数を使うパターン)
自分の力で解答できたのはコレ。
(defn last-chair [n]
(- n 1)
)
解答例2(ポイントフリースタイル)
他の人の解答より、数値全般に使えるデクリメント関数 dec
を使うこともできる。
(def last-chair dec)
引数を取る解答例1では関数定義に defn
を使っていたが、こちらのポイントフリースタイルでは def
が使われている。この違いは何だろう?
↑曰く、defn
は呼び出しの度に評価されるのに対し def
は一度だけ評価されるという違いがあるらしい。
こうやって問題を解きながら自分の知らない記法や構文を他の方の解答から吸収していけるのが Codewars の良いトコロだと思う。