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())
  }
}