勉強のためにListのAPIはなるべく使わない方向。
// P25 (*) Generate a random permutation of the elements of a list.
// Hint: Use the solution of problem P23.
// Example:
// scala> randomPermute(List('a, 'b, 'c, 'd, 'e, 'f))
// res0: List[Symbol] = List('b, 'a, 'd, 'c, 'e, 'f)
// P20 (*) Remove the Kth element from a list.
def removeAt[T](i: Int, xs: List[T]) = {
def r(i: Int, xs: List[T], acc: List[T]): (List[T], T) = (i, xs) match {
case (0, h :: t) => (acc.reverse ::: t, h)
case (i, h :: t) => r(i - 1, t, h :: acc)
}
if(i < 0 || xs.size <= i) throw new NoSuchElementException else r(i, xs, Nil)
}
import scala.util.Random
def randomPermute[T](xs: List[T]) = {
val rand = new Random
def r(ys: List[T], acc: List[T]): List[T] = {
if(ys.size == 1) ys.head :: acc
else {
val (rest, removed) = removeAt(rand.nextInt(ys.size), ys)
r(rest, removed :: acc)
}
}
if(xs.isEmpty) Nil else r(xs, Nil)
}
解答例
またもや、してやられたぜ!