run length encoding って、手続型で書くの面倒だよね。というか、手続型で書くこと考えるの面倒くさくていやだよ。
Scalaちゃんで解いてみる。
scala> def runlength[T](list: List[T]): List[(T, Int)] = list match {
| case Nil => Nil
| case x :: xs => val (first, rest) = xs.span(x ==)
| (x, first.length+1) :: runlength(rest)
| }
runlength: [T](list: List[T])List[(T, Int)]
scala> runlength("aaabbabbbdccbabaaabab".toList)
res11: List[(Char, Int)] = List((a,3), (b,2), (a,1), (b,3), (d,1), (c,2), (b,1), (a,1), (b,1), (a,3), (b,1), (a,1), (b,1))
やった、4行で書けちゃった。仕方ないので(何が?)、糞みたいなコードも書いてみた。
これ見た?