ScalaでProject Euler(52)

Problem 30

上限を見つけてあとは等式が成り立つかどうか調べるだけですね。

import scala.testing.Benchmark

def pow(n :Int, e :Int) = (1 to e).foldLeft(1)((x, y) => x * n)

val E = 5

def calc_upper() = {
    val e = Iterator.from(1).filter(e => e * pow(9, E) < pow(10, e)).next
    pow(9, E) * e
}

def solve() = {
    val pows = Array.range(0, 10).map(pow(_, E))
    
    def digits(n :Int) :List[Int] =
        if(n == 0) Nil else (n % 10) :: digits(n / 10)
    
    def is_valid(n :Int) =
        digits(n).map(pows(_)).sum == n
    
    println ((2 to calc_upper()).filter(is_valid).sum)
}

object Test extends Benchmark {
    def run() = solve
}

println (Test.runBenchmark(10))