私はScalaが初めてです!ただし、オイラー問題 4par
に対する次の実用的な解決策があります。使用できるかどうかを確認するためだけに使用したいと思います。
import scala.math
object Problem4 {
def isPalindrome(x: Int): Boolean = {
val string = x.toString
string.reverseIterator.sameElements(string.iterator)
}
def getPairs(minimum: Int, maximum: Int) = {
for (i <- minimum to maximum view;
j <- minimum to maximum view)
yield (i, j)
}
def getAnswer(numberOfDigits: Int): Int = {
val maximum = math.pow(10, numberOfDigits).toInt
val minimum = math.pow(10, numberOfDigits - 1).toInt
val products = for {
pair <- getPairs(minimum, maximum)
product = pair match { case (i, j) => i * j }
if isPalindrome(product)
} yield product
products.par.max
}
def main(args: Array[String]) {
val answer = getAnswer(4)
println("Problem 4 answer: %s".format(answer))
}
} // object Problem4
Project Euler 4は 3 桁の数字を要求しますが、私の PC では 4 桁の数字の答えを見つけるのに 63 秒かかり、デュアルコア システムでは 1 つのプロセッサしか使用しないことに気付きました。par
これは、式の最後に適用されているにもかかわらずfor
です。
を使用してこれを並列化するにはどうすればよいpar
ですか? 理想的には、4桁の答えを30〜40秒で見つけたいと思っています。ありがとう!
編集:私はかなり確信してgetPairs
いますView
:
scala> def getPairs(minimum: Int, maximum: Int) = {
| for (i <- minimum to maximum view;
| j <- minimum to maximum view)
| yield (i, j)
| }
getPairs: (minimum: Int, maximum: Int)scala.collection.SeqView[(Int, Int),Seq[_]]
さらに、呼び出しに追加par
するとgetPairs
警告が返され、プロセッサの 1 つしか使用されず、java.lang.OutOfMemoryError: Java heap space
例外が発生します。
[info] Loading project definition from M:\programming\testdriveneuler\src\problem4\project
[info] Set current project to euler (in build file:/M:/programming/testdriveneuler/src/problem4/)
[info] Compiling 1 Scala source to M:\programming\testdriveneuler\src\problem4\target\scala-2.9.2\classes...
[warn] M:\programming\testdriveneuler\src\problem4\src\main\scala\Problem4.scala:39: `withFilter' method does not yet exist on scala.collection.parallel.ParSeq[((Int, Int), Int)], using `filter' method instead
[warn] pair <- getPairs(minimum, maximum).par
[warn] ^
[warn] one warning found
編集: オイラー問題 4 の答えを 2 つの 4 桁の数の積について計算することに明らかに関心があります。参考までに、答えは99000099
です。