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
を使えば簡単に解けた。