Scala找到最小的立方体,其数字的五个排列正好是立方体

时间:2014-02-12 07:52:48

标签: scala permutation cube

我遇到了这个很棒的问题,并尝试用scala解决它以学习语言。问题的简短解释在标题中,这里有更长的解释http://www.mathblog.dk/project-euler-62-cube-five-permutations/

我在Javascript中解决了它并试图将逻辑转移到scala,但它并没有完全奏效。它适用于找到3个排列而不是4,5和可能向上。

以下是代码:

import collection.mutable.Map
import collection.mutable.{Map => MMap}

val mutMap3 = MMap.empty[String, MMap[String, Int]]
def pow(n:Int) : Int =  { 
  val cubed = (n * n * n).toString
  val digits = 0 to 9
  var str = ""
  for (a <- digits) {
    val b = cubed.count(_.toString==a.toString)
    str += b
  }
  if (mutMap3 contains str) {
    mutMap3(str)("len") += 1
    if(mutMap3(str)("len") == 5) {
      return mutMap3(str)("first")
    }
  } else {
    mutMap3(str) = MMap("len" -> 1, "first" -> n)
  }
  return pow(n+1)
}

我的想法是,由于排列只是顺序的重新排列,(即4233是3234的排列),那么您可以只计算每个数字出现的次数,这将代表所有可能的排列。在4233的排列中,&#34; 0&#34;发生0次,&#34; 1&#34;发生0次,&#34; 2&#34;发生2次,&#34; 4&#34;发生一次,&#34; 5&#34;发生0次......等一直到9,这可以放在一个字符串中作为&#34; 0012100000&#34;作为整数的出现次数&#34; 0123456789&#34; (4233和3234以及&#34; 2&#34;,&#34; 3&#34;和&#34; 4&#34;的所有其他组合可以表示为&#34; 0012100000&#34; )。所以用简单的英语,取一个数字,立方体,把它变成一串特定整数的出现,存储它并计算我们看到它的次数,因为我们一直用数字+ 1调用函数,直到特定的排列发生5次,然后从我们第一次获得该排列时返回该数字。

我希望看到其他方法,但我真的很想知道为什么我的工作不起作用以及它是否是一种好方法。玩得开心!

1 个答案:

答案 0 :(得分:1)

不是特别有效但简洁:

scala> val cubes=(0 to 5030).map(c=>c.toLong*c*c).toSet

cubes: scala.collection.immutable.Set[Long] = Set(2628072, ...

scala> cubes.par.filter(_.toString.permutations.map(_.toLong).filter(cubes.contains(_)).length==5)

res6: scala.collection.parallel.immutable.ParSet[Long] = ParSet(38614472000, 10648000000, 10403062487, 91125000000, 65939264000, 54439939000, 95443993000, 122763473000, 116500279104, 114791256000, 40920960536, 103823000000)