乘以受限操作


44

击败目前最好的答案500名非官方赏金

目标

您的目标是仅使用一组非常有限的算术运算和变量赋值将两个数相乘。

  1. 加成 x,y -> x+y
  2. 倒数x -> 1/x除法x,y -> x/y
  3. 求反x -> -x不是减法x,y -> x-y,尽管您可以通过两个操作来完成x + (-y)
  4. 常数1(不允许其他常数,除非由的操作产生1
  5. 变量分配 [variable] = [expression]

评分:值以变量a和开始b。您的目标是使用尽可能少的操作将其产品保存a*b到变量中c。每个操作和分配都+, -, /, =花费一个点(等效地,每次使用(1),(2),(3)或(4))。常量1是免费的。最少的解决方案获胜。Tiebreak是最早的帖子。

允许:您的表达式必须在算术上对“随机”实数a和正确b。它可能在R 2的零测量子集上失败,即,如果在a- b笛卡尔平面中绘制,则该集合没有面积。(由于0类似的表达式的倒数,可能需要这样做1/a。)

语法:

这是一个。不得使用其他操作。特别是,这意味着没有函数,条件,循环或非数字数据类型。这是允许的操作的语法(可能性用分隔|)。程序是<statement>s 的序列,其中a <statement>如下所示。

<statement>: <variable> = <expr>
<variable>: a | b | c | [string of letters of your choice]
<expr>: <arith_expr> | <variable> | <constant>
<arith_expr>: <addition_expr> | <reciprocal_expr> | <negation_expr> 
<addition_expr>: <expr> + <expr>
<reciprocal_expr>: 1/(<expr>)
<negation_expr>: -<expr>
<constant>: 1

只要您清楚自己在做什么并且您的操作数正确,您实际上就不必在此确切的语法中编写代码。例如,您可以将其编写a-ba+(-b)两个操作并将其计为两个操作,或者为简洁起见定义宏。

(之前有一个问题“ 不带乘”的“乘”,但是它允许一组更宽松的操作。)


4
这有可能吗?
Ypnypn 2014年

1
@Ypnypn是的,我已经写了一个例子来确保。
xnor 2014年

2
这似乎是一个挑战,因为有可能找到最佳解决方案(一旦找到任何解决方案)。那么在这种情况下,抢七局是什么?
Martin Ender 2014年

1
在这种情况下,@MartinBüttnerTiebreak最早发布。我认为有很大的优化空间,所以我认为寻找有效的并干净地编写它并不是一场竞赛。至少那是我在尝试中发现的;也许有人会找到一个最小的解决方案。
xnor 2014年

2
好的,因为不是每个人都认为我的烦恼和我一样有趣,所以我删除了它并在此处评论:关于度量零集的规则并不是很明智的选择,因为有理数是关于勒贝格度量的度量零集,我建议而是使用一定百分比。(或另一种)但是我完全喜欢这个挑战的想法!
瑕疵的

Answers:


34

22次行动

itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(itx + itx + 1/(1+nx)) + 1/(1/(a+nx) + 1/(b+nx)) ) #14

在线尝试!

操作是10个加法运算,7个逆运算,2个求反运算和3个赋值。

那么,我是怎么得到这个的?我从两个双层分数之和的有前途的模板开始,这是先前许多尝试中出现的主题。

c = 1/(1/x + 1/y) + 1/(1/z + 1/w)

当我们将总和限制为时x+y+z+w=0,会发生漂亮的抵消,从而得出:

c = (x+z)*(y+z)/(x+y)

其中包含一个产品。(通常t*u/vt*u第一个拥有1级学位更容易获得。)

有一种更对称的方式来考虑此表达式。在限制条件下x+y+z+w=0,其值p,q,r由其成对和的三个参数指定。

 p = x+y
-p = z+w
 q = x+z
-q = y+w
 r = x+w
-r = y+z

而且我们有c=-q*r/p。该总和p的区别在于分母与对(x,y)(z,w)变量的分数相同。

这对于cin来说是一个很好的表达p,q,r,但是双层分数在in中,x,y,z,w因此我们必须用后者来表示前者:

x = ( p + q + r)/2
y = ( p - q - r)/2
z = (-p + q - r)/2
w = (-p - q + r)/2

现在,我们要选择p,q,r,使c=-q*r/p平等a*b。一种选择是:

p = -4
q = 2*a
r = 2*b

然后,将q和的两倍值r方便地减半:

x = -2 + a + b
y = -2 - a - b
z =  2 + a - b
w =  2 - a + b

将其另存2为变量t并将其插入等式中c可获得24运算符的解决方案。

#24 ops
t = 1+1   #2
c = 1/(1/(-t+a+b) + 1/-(t+a+b))  +  1/(1/(-b+t+a) + 1/(-a+b+t)) #1, 10, 1, 10

有12个加法,6个逆,4个否定和2个赋值。

很多操作花费在表达x,y,z,w方面1,a,b。为了节省OPS,而不是表现xp,q,r(因此a,b,1),然后写y,z,w在以下方面x

y = -x + p
z = -x + q
w = -x + r

选择

p = 1
q = a
r = b

并表示cc=-q*r/p,我们得到

x = (1+a+b)/2
y = -x + 1
z = -x + a
w = -x + b

不幸的是,减半的x成本很高。需要通过反转,将结果添加到自身并再次反转来完成。我们也抵消了生产nx-x,因为那是什么y,z,w用。这为我们提供了23种解决方案:

#23 ops
itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(1/(-nx) + 1/(1+nx))  +  1/(1/(a+nx) + 1/(b+nx)) ) #15

itx是1 /(2 * x)并且nx-x。最终优化表达1/x为,itx+itx而不是模板化,这会1/(-nx)削减字符,并将解决方案降低到22个操作。


有21个操作的简单优化。itx + itx发生两次,但itx在任何其他情况下都不会发生。改为定义,ix = (1+1)/(1+a+b)然后用一个替换两个添加项。
彼得·泰勒

并通过提取m = -1有可能获得20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
Peter Taylor

3
嗯,这两个优化都失败了,因为支持的操作是对等而不是除法的。
彼得·泰勒

如果ab只有一分开,然后或者a + nx = 0b + nx = 0由零造成您的解决方案鸿沟。
MooseOnTheRocks

1
@MooseOnTheRocks很好,请参见代码中零度量子集可能失败的挑战中的“津贴”。我认为,否则挑战是不可能的。
xnor

26

23次

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
res = z+z

爆炸证明:

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
             1/(a+1)+1/(b+1)                            == (a+b+2) / (ab+a+b+1)
          1/(1/(a+1)+1/(b+1))                           == (ab+a+b+1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1                         == (ab - 1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1)             == ab / (a+b+2)
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))            == (a+b+2) / ab
                                              1/a+1/b   == (a+b) / ab
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)  == 2 / ab
    1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)) == ab / 2

z = ab / 2 and therefore z+z = ab

我滥用了Wolfram Alpha来获得这张漂亮的图片(Wolfram Alpha试图让我订阅pro来保存它,但是然后按下ctrl-c ctrl-v ;-)):

得分(加上+减法):

z = ////++/++-+/++++-/+/
res = +

祝贺最短的解决方案!
xnor 2014年

@xnor感谢您给我我的第一个被接受的答案和我的第一个赏金!
骄傲的haskeller 2014年

不要挑剔,但...(b + 1))-1 + 1 ...和... 1))-(1 / a + ...不应该...(b + 1) ))+-1 + 1 ...和... 1))+-(1 / a + ...?
tfitzger 2015年

@tfitzger我认为这样比较容易。问题确实说没关系。请注意,我确实正确计算了分数(每个负值为2)
骄傲的haskeller 2015年

Wolfram Alpha有7天的免费试用期。
ghosts_in_the_code

13

29次行动

不工作,为集合{(A,B)∈ [R 2 | a + b = 0或a + b = -1或ab = 0或ab = -1}。那可能是零?

sum = a+b
nb = -b
diff = a+nb
rfc = 1/(1/(1/sum + -1/(sum+1)) + -1/(1/diff + -1/(diff+1)) + nb + nb)  # rfc = 1/4c
c = 1/(rfc + rfc + rfc + rfc)

# sum  is  2: =+
# nb   is  2: =-
# diff is  2: =+
# rfc  is 18: =///+-/++-//+-/+++
# c    is  5: =/+++
# total = 29 operations

rfc如果我们定义一个宏,则(Reciprocal-Four-C)的结构会更加明显:

s(x) = 1/(1/x + -1/(x+1))              # //+-/+ (no = in count, macros don't exist)
rfc = 1/(s(sum) + - s(diff) + nb + nb) # =/s+-s++ (6+2*s = 18)

让我们做一下数学:

  • s(x),在数学上是is 1/(1/x - 1/(x+1)),是在代数is x*(x+1)或之后x*x + x
  • 当您将所有内容细分为时rfc,实际上1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))就是1/((a+b)^2 - (a-b)^2)
  • 正方形,或只是简单的扩张差异后,你得到的rfc1/(4*a*b)
  • 最终,c是4的倒数rfc,因此1/(4/(4*a*b))变为a*b

2
+1,我正在完成这个相同的计算
Eric Tressler 2014年

1
那肯定是零。这是一条线的结合。
xnor 2014年

不想发表评论关于线的结合... @algorithmshark您能告诉我们更多您是怎么想到这个身份的吗?您如何解决这个问题?
瑕疵的

1
@flawr我s(x)从微积分中回顾了适合该问题要求的属性,因此这意味着我具有平方函数。经过一番忙碌之后,我发现我可以a*b用平方差技巧来形容。一旦有了这些,就可以尝试确定哪些分配可以节省操作。
algorithmhark

既然您使用了-13次in rfc,您是否不能通过将其分配给变量来打出一个角色?
isaacg 2014年

9

27次

tmp = 1/(1/(1+(-1/(1/(1+(-a))+1/(1+b))))+1/(1/(1/b+(-1/a))+1/(a+(-b))))
res = tmp+tmp+(-1)

# tmp is 23: =//+-//+-+/++///+-/+/+-
# res is 4: =++-

这背后没有理论依据。我只是试图让(const1+a*b)/const2,并开始与(1/(1-a)+1/(1+b))(-1/a+1/b)


tmp实际上是23岁,因此得分为27岁。
algorithmhark
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.