昼間に書いたやつは整数にしか対応してなかったので文字でもできるようにしてみた。
scalazを使うと簡単にできる。
import scalaz._
import Scalaz._
object Main extends App {
def group_mini[A](seq: Seq[A], s: A, e: A)(implicit enum: Enum[A]): Seq[(A, A)] = seq match {
case Nil => Seq((s, e))
case h+:t =>
if(h === e.succ)
group_mini(t, s, h)
else
(s, e) +: group_mini(t, h, h)
}
def group[A](seq: Seq[A])(implicit enum: Enum[A]) = seq match {
case Nil => Nil
case h+:t => group_mini(t, h, h)
}
val sample1 = Seq(1, 2, 3, 4, 5, 8, 9, 10, 13, 14, 20, 22)
val sample2 = "ABCabc01234def56789DEF".sorted
println(group(sample1))
println(group(sample2))
}
実行結果
List((1,5), (8,10), (13,14), (20,20), (22,22))
List((0,9), (A,F), (a,f))
scalaz使わなくてもできるのかな?