Open3

Codewars 演習記録 in Clojure

えとあるえとある

<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 が使われている。この違いは何だろう?

https://stackoverflow.com/questions/4461320/clojure-def-vs-defn-for-a-function-with-no-arguments

↑曰く、defn は呼び出しの度に評価されるのに対し def は一度だけ評価されるという違いがあるらしい。

こうやって問題を解きながら自分の知らない記法や構文を他の方の解答から吸収していけるのが Codewars の良いトコロだと思う。