Project Euler: Problem41
前回のやつはスタックオーバーフローするので scala で適当に書き直し。ひどいコードだなぁ。
今回ので"(1 to 5)"とか書けることを知った。
object Problem41 { val digit : Int = 9 val end : Int = List.range(digit,1-1,-1).foldLeft(0)((x,y) => x*10+y) / 2 def pandigitals(n:Int, xs:List[Int]) : List[Int] = { if ( n == 0 ) { return List(0); } else { for ( x <- xs; xs2 <- pandigitals(n-1, xs.filter(y => x != y)) ) yield x + xs2*10 } } def main(args : Array[String]) : Unit = { var pandigital : List[Int] = List.range(2, digit+1).flatMap(n => pandigitals(n, List.range(1, n+1)).sort(_<_)) println("Complete preparation") var n : Int = 3 pandigital = pandigital.filter(x => x%2 != 0) var maxprime = 0 while (pandigital.length != 0 && n < end) { if (pandigital.head == n) maxprime = pandigital.head pandigital = pandigital.filter(x => x%n != 0) n += 2 } println("Result: "+((maxprime::pandigital).sort(_<_).last).toString()) } }