18 October, 2008

[Project Euler] Problem 4

Project EulerのProblem 4

 最初に作ったコードはは3桁 x 3桁の2重ループで積を求めて、それが回文数になっているかをチェックし、積の大きさでソート、という解法で解きました。
 まぁ計算時間が1分以内ならどんな解き方でも良い様なものですが、最大の回文数を1つだけ求めれば良いならば、逆に大きな回文数から順に3桁 x 3桁になるか試した方が無駄が無い様にも思ったので次の様なコードに。ここでもStreamを作ってheadで最初の要素だけ求めます。
 この手のパズル的な問題を解く時には遅延リストは便利ですね。Haskellで解けばもっと楽なのだろうなぁ...。

object P004 {
def main(args:Array[String]) {
time({println(p004)})
}
val palins:Stream[Int] =
for(x <- Stream.range(9,0,-1);
y <- Stream.range(9,-1,-1);
z <- Stream.range(9,-1,-1))
yield (100001*x + 10010*y + 1100*z)
def f(n:Int):Stream[Tuple3[Int,Int,Int]] = {
Stream.range(999,99,-1).filter{x => (n%x==0)&&(100<=n/x)&&(n/x<1000)}.map{x => (x,n/x,n)}
}
def p004:Tuple3[Int,Int,Int] = palins.flatMap(f).head
def time(block:Unit) {
val t0 = System.currentTimeMillis
block
println((System.currentTimeMillis-t0)+"msec")
}
}

No comments: