Scala 368:
第二个g = -Line更容易测试,第一个g = -Line可以灵活地接受命令参数,并且它们的长度相等,因此我仅从第二个开始计数-将其删除以进行args传递:
val g=(args.map(_.toDouble))
val g=Array(3,9,2, 1, 6, 87)
val k="+*/-DQ"
val i=(0 to 5)
val f:Seq[(Double,Double)=>Double]=Seq(_+_,_*_,_/_,_-_,(a,b)=>b-a,(a,b)=>b/a)
val h=g.init.permutations;
for(j<-h;o<-i;p<-i;q<-i;r<-i;z=try{f(r)(f(q)(f(p)(f(o)(j(0),j(1)),j(2)),j(3)),j(4))}catch{case _ => 0}
if(z==g(5)))printf("(((%d%c%d)%c%d)%c%d)%c%d=%d\n",j(0),k(o),j(1),k(p),j(2),k(q),j(3),k(r),j(4),g(5))
示例输出(您可能现在有一个问题-稍后):
(((5+7)/1)+6)*3=54
(((5-7)D1)*6)*3=54
(((5D7)+1)*6)*3=54
(((5+7)+6)Q1)Q3=54
那5D7呢?D1?是十六进制吗?有Q1,Q3-那是什么。
Sir_Lagsalot本着挑战的精神允许进行新的基本操作,是的,这些是基本操作,即Delta和Quotient。
它们与a / b和ab的不同之处在于aQb表示b / a,而aDb表示ba。我们称其为乌克兰记号。
所以
(((5-7)D1)*6)*3=54
手段
((1-(5-7))*6)*3=54
(1-(-2))*6*3
3*6*3 = 18*3=54
关于如何以及为什么这样一个更有趣的问题:一开始,我对放置括号的可能性以及(a + b)-c = a + bc =(a + bc)=((a + b) )-c)=(b + a)-c等。您可能会为这个问题感到生气,但是如果写下可能的括号组合,则有时会丢掉便条纸而面对这样一个事实:您始终在5个值之间执行4个运算,并且始终从其中之一开始。如果模式始终是(((_x_)x_)x_)x_ ?= _
(x是4个运算符之一)并且允许相反的方向(xb)和(bxa),则说明了所有可能性。
现在,对于a + b和a * b,我们不需要相反的方向,它们是可交换的。因此,我发明了D和Q运算符,它只是切换方向。现在,我还有2个操作员,但不需要切换方向。好吧-这是在功能Sequence中完成的:
(a,b)=>b-a,(a,b)=>b/a
我的理解力是从Array g中获取值,并将其分布在a到e上,然后选择4个索引来选择函数,然后选择(仅按索引)关联的运算符。我必须捕捉div / 0错误,因为减法可能导致零,而样本输入数据不包含0。