不只是一个四肢难题


11

在该方案中的4个4困扰你应该使用最多x x's(并且没有其他号码),并定义了一组操作的从0达到每号为100。如果x = 4那么你可以使用多达四个4s,这问题就变成经典的4个4拼图(除非您最多可以使用四个4,而不必只使用四个)。我们假设1 < x <= 9

在此版本中,仅允许以下运算符:

  • 加法(+),减法(-),乘法(*),除法(/)。请注意,这是实数除法,因此5/2 = 2.5
  • 求幂(例如4 ^ 4),因为如果用手工正常书写,将不涉及任何多余的符号。
  • 您可以通过串联创建新的整数xs。例如,您可以使整数4, 44, 444, 4444

您也可以仅使用括号将数字分组,以控制运算符的求值顺序。例如,您不能像那样将括号与串联结合在一起(4/4)(4/4) = (1)(1) = 11

不得使用其他符号,并且适用标准的操作顺序。

如果输入x在定义的范围内且n介于两者之间0100包括两端),则程序应为该输入生成正确的解决方案(如果存在)。否则,您的代码必须输出某些内容以指示不存在此类解决方案。

您必须能够在允许范围内的任何输入值下xn在计算机上运行提交以完成操作。这就是代码高尔夫,因此最短的解决方案将获胜。

这个古老的相关问题使用更多的运算符(只有4s),因此从0到100的所有数字都是可解的,因此对于此挑战而言并非如此。

输入输出

您的代码需要两个整数xn作为输入和输出应该解决(或者指示没有解决)在您方便的任何人类可读的格式。例如,输入4 6将意味着“使用最多四个4,使数字为6”。因此,如果输入为4 6输出,则可能为(4+4)/4+4



2
括号可以与串联结合吗?例如`(4/4)(4/4)=(1)(1)= 11?
数字创伤

1
添加括号(并禁止使用括号+串联)确实使此操作变得更加困难
Draconis

2
在使用数字的次数上增加幂运算符和外循环不要在IMO上通过codegolf.stackexchange.com/q/82884/194
Peter Taylor

2
@PeterTaylor括号似乎起了很大的作用。如果可以的话,我将投票决定重新开放。
felipa

Answers:


4

Python 3,265字节

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

在线尝试!

适用于工程师吐司链接的参考文献中的所有编号。

x=8在tio上运行,x=9在我的计算机上花费了几分钟。


该函数g返回与最多一组的所有组合的x数目x的。f然后循环遍历它们,并返回第一个计算得出的数字n

我为每个发现的可能值的数量x是:

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

所有号码以上可以从产生(a+b)(a-b)(a+b)a*ba/b(a/b),和a^ba+b并且a-b不要给出更多的数字。

a^b 也只能使用一次,否则会产生大量数字(在上面的参考文档中也进行了验证)


一个替代版本,一旦找到解决方案,它就会短路(而不是打高尔夫球):

由于x=7..9可以创建所有数字,因此速度更快。

Python 3中338个 289字节

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

在线尝试!


这是一个非常好的答案!我还以为你总是使用完全相同(相对于高达)×XS(如(4/4**(4-4))4),但事实证明并非如此。
阿努什

exit(e)短于return e
mbomb007 '18
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.