ScalaでProject Euler(41)

Problem 24

この問題は答えを出すだけなら手計算レベルです。階乗で割っていって余りを求めるだけです。ただ、関数型らしく書いたらややこしくなってしまったので、var使いまくりで書いてみました。

def factorial(n :Int) =
    (1 to n).foldLeft(1)(_ * _)

def pop(a :List[Int], k:Int) :(Int,List[Int]) =
    if(k == 0)
        (a.head, a.tail)
    else {
        val (m, xs) = pop(a.tail, k - 1)
        (m, a.head :: xs)
    }

class IterDigits(N :Int) extends Iterator[Int] {
    var r = N - 1
    var n = 9
    var a = List.range(0, 10)
    
    def hasNext() = n >= 0
    
    def next() = {
        val f = factorial(n)
        val k = r / f
        r = r % f
        val (m, b) = pop(a, k)
        a = b
        n -= 1
        m
    }
}

val N = 1e6.toInt
println ((new IterDigits(N)).foldLeft(0L)(_ * 10 + _))