Clojureの勉強のために、L-99: Ninety-Nine Lisp Problemsを解いてみる。
問題自体はまだまだ簡単だが、Clojure的に良い書き方になっているかどうか…。
P11 (*) Modified run-length encoding.
P10を改良して、要素の個数が1個であれば個数と要素の組ではなく、要素のみにする。
最初、P10の結果を使わず1からリストを組み立てようとして解いてみたが、P13で同じことを要求されるので
p10-2.cljで作ったmy-encodeを呼び、その結果を加工して解くことに。
P12 (**) Decode a run-length encoded list.
連長圧縮したリストを元のリストに戻す。
まずはmapでリストのリストを作り、flattenする解き方。
(replicate n e)でeをn個連続したリストを作っている。
これにはひとつ問題があり、flattenは複数ネストしたリストを全て平坦にするので、
例えば(my-decode '((2 (a)) (b c) (3 (d e))))など要素自体がリストの場合
期待する結果は((a) (a) (b c) (d e) (d e) (d e))なのだが(a a b c d e d e d e)となってしまう。
そこで、flattenを使わずにconcatでのリスト連結をreduceで畳み込む解き方に変更。
P13 (**) Run-length encoding of a list (direct solution).
P11との違いは、一旦P10の結果のリストを作ってから要素数1であれば要素のみにする、という解き方ではなく、
直接解となるリストを作る、だと思う。(訳に自信が無いが…多分)
まずはp10-1.cljに手を加えたloop/recurを使う解き方。
次にp10-2.cljに手を加えたpartition-byを使う解き方。
P14 (*) Duplicate the elements of a list.
各要素が2個続けて出現したリストを作る。replicateを使えば簡単に解けた。
P15 (**) Replicate the elements of a list a given number of times.
重複個数を引数で指定できるようにしたもの。こちらもほぼP14と同じ解き方で。

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .