二零一五难题


13

背景

这个难题是四个四分之一难题的变体(本身就是上一个问题的主题)。像这个难题一样,目标是仅使用四位数字和某些数学运算符来查找不同整数的数学表达式。但是,在这种情况下,允许的数字仅为2、0、1和5。每个解决方案必须以正确的顺序准确地出现一次。令人惊讶的是,可以用这种方式表示许多整数。鼓励求解器首先尝试手动解决问题,因为它很有趣。

规则

常数可以由一个或多个数字构成:

  • 整数:例如2、0、15等
  • 小数:例如.2,.01、1.5等。
  • 重复小数点:例如.2〜(= 0.222 ...)、. 15〜(= 0.1555 ...),20.15 ~~(= 20.1515 ...)

允许以下一元运算:

  • 一元否定:-x
  • 平方根:sqrt(x)
  • 整数阶乘:x!

允许以下二进制操作:

  • 标准算术运算符:x + y,xy,x * y和x / y
  • 任意幂:x ^ y
  • 任意根:rt [x](y)(= y的第x个根)

任务

您的程序应打印出尽可能多的0到100之间的整数的表达式,然后输出产生的表达式数量。

  • 解决方案必须按顺序打印,格式为n = [expr]。
  • 表达式必须依次使用所有数字2、0、1、5。
  • 表达式必须使用上述符号打印。允许但不需要括号,空格也是如此。运算符的优先级顺序为一元否定,阶乘,乘幂,乘/除和加/减。
  • 该程序无需返回所有数字的解决方案。因此,仅输出0的程序有效。但是,请参阅下面的评分部分。
  • 该程序应在不到15分钟的现代计算机上运行。

您可以编写程序或函数。表达式应打印到STDOUT(或最接近的替代项)。表达式的数量可以打印到STDOUT或作为整数返回。适用标准代码的高尔夫限制。

输出示例

0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4

计分

更新@orlp注意到计分系统存在缺陷。有关如何或是否应解决此问题的讨论,请参见http://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challenge

首先根据解决方案产生的表达式数对其进行评分,然后再根据其代码长度(以字节为单位)对解决方案进行评分。因此,产生80个结果的1000字节程序将击败仅产生79个结果的100字节程序(尽管可以很容易地扩展后者以包括丢失的结果)。

对于那些想要激发目标的人,下面是可以表示的表达式数量的下限。我不打算提交参赛作品,因此以更少的钱赢得比赛很有可能!

至少有85个(共101个),尽管可能更高。

计分板

作为额外的奖励,这是分数进展的摘要。只要您得分最高,就可以将自己添加到表的顶部(或要求其他人加入)。

  • 0个表达式,1个字节(Pyth):仅输出0的实现

.20是允许的常数吗?
路加福音

1
@Luke:是的,尽管它也可以表示为(.2 + 0),所以它不会增加表达力
Uri Granta'Aug

1
@orlp请注意,前导零和大于零的分数不会增加任何表达性:例如015 = 0 + 15和1.5 = 1 + .5。
乌里·格兰塔

1
@ mbomb007太复杂了。这是我写的一个简短说明:gist.github.com/orlp/e92b3b7d26ad9b11378e
orlp 2015年

2
@UriZarfaty然后有99个不同的有用常数集:gist.github.com/orlp/eb997e49e41878c76d0a
orlp

Answers:


9

85,〜2400字节

我有点难过,这是一场代码高尔夫挑战赛,因为我觉得以前的所有努力现在都变得毫无用处,因为我将发布以下内容:

  0 = ((2*0)^15)
  1 = ((2^0)^15)
  2 = (2-(0^15))
  3 = (20*.15)
  4 = (20*(1/5))
  5 = (20-15)
  6 = ((.20+1)*5)
  7 = ((20*.1)+5)
  8 = (2*((0-1)+5))
  9 = ((.20/.1~)*5)
 10 = (20/(1/.5))
 11 = ((((2-0)+1))!+5)
 12 = (20*(.1+.5))
 13 = ((-(2)-0)+15)
 14 = (20-(1+5))
 15 = ((2*0)+15)
 16 = ((2^0)+15)
 17 = ((2-0)+15)
 18 = (20-(1/.5))
 19 = (20-(1^5))
 20 = (20^(1^5))
 21 = (20+(1^5))
 22 = (20+(1/.5))
 23 = (((2-0)/.1~)+5)
 24 = ((20-1)+5)
 25 = ((20^1)+5)
 26 = ((20+1)+5)
 27 = (rt[.2](((0)!+1))-5)
 28 = (2*(-((0)!)+15))
 29 = ((((2+(0)!)+1))!+5)
 30 = ((2-0)*15)
 31 = (20+sqrt((1+(5)!)))
 32 = ((20*.1)^5)
 33 = ((.2^-((0)!))/.15~~)
 34 = (2+(((0)!+1)^5))
 35 = (20+15)
 36 = (20*(1/.5~))
 37 = (rt[.2](((0)!+1))+5)
 38 = ((20-1)/.5)
 39 = (-((2^0))+(sqrt(.1~)*(5)!))
 40 = (20*(1/.5))
 41 = (((.2~^-((0)!))/.1~)+.5)
 42 = ((20+1)/.5)
 43 = (-(2)+(((0)!/.1~)*5))
 44 = (20+((-(1)+5))!)
 45 = (20/(1-.5~))
 46 = ((.2+((0)!/.1~))*5)
 47 = (2+(((0)!/.1~)*5))
 48 = (2*(((0-1)+5))!)
 49 = ((((2+(0)!))!/.1~)-5)
 50 = (((2^0)/.1)*5)
 51 = ((.2+((0)!/.1))*5)
 52 = (2+(((0)!/.1)*5))
 54 = (((2+(0)!)/.1)/.5~)
 55 = ((2+((0)!/.1~))*5)
 56 = (((.2-(0)!)+sqrt(.1~))*-((5)!))
 58 = (-(2)+sqrt((((((0)!/sqrt(.1~)))!)!*5)))
 59 = ((((2+(0)!))!/.1~)+5)
 60 = (20/(.1~^.5))
 62 = (2*(-((0)!)+sqrt(rt[-(.1)](.5))))
 64 = ((2-0)^(1+5))
 65 = ((20/sqrt(.1~))+5)
 66 = ((-(((2+(0)!))!)/.1~)+(5)!)
 67 = (((((2+(0)!))!)!*.1)-5)
 69 = ((2^(((0)!/sqrt(.1~)))!)+5)
 70 = (((.2^-((0)!))/-(.1))+(5)!)
 72 = ((2+(0)!)*((-(1)+5))!)
 75 = ((.2^-((0)!))*15)
 76 = (rt[(-(2)^-((0)!))](.1~)-5)
 77 = (((((2+(0)!))!)!*.1)+5)
 78 = (2*(-((0)!)+(sqrt(.1~)*(5)!)))
 80 = (-(20)*(1-5))
 81 = (201-(5)!)
 82 = (2*((0)!+(sqrt(.1~)*(5)!)))
 84 = (((.2-(0)!)+.1)*-((5)!))
 85 = (((((2+(0)!))!)!*.1~)+5)
 86 = (rt[(-(2)^-((0)!))](.1~)+5)
 88 = (rt[.2]((-((0)!)-1))+(5)!)
 90 = ((20/.1~)*.5)
 93 = (((2+(0)!)/-(.1~))+(5)!)
 95 = ((20-1)*5)
 96 = ((.20-1)*-((5)!))
 98 = (-(20)*(.1-5))
 99 = ((-(20)-1)+(5)!)
100 = (20/(1/5))
85

从这里开始,这只是一个压缩挑战。也许我以后会参加比赛,也许我不会。对我而言,最大的乐趣在于寻找最多的配方的挑战。

对于那些努力编写求解器的人来说,运行时应该不是问题。如果要检查的公式太多,则需要更好的启发法来丢弃无望的解决方案和重复项。我编写的用于生成上述代码的代码在Python上运行约5秒钟。


rt [.1](-。5)是-0.5的0.1根,而不是0.1的-0.5根。
乌里·格兰塔

另外,我开始怀疑获胜者很可能是压缩文本输出。应该想到了一种更好的方法来避免这种情况:-(
Uri Granta

@UriZarfaty哦,我将在代码中修复该问题并重新运行,请给我一秒钟。
orlp

我大大高估了与程序大小相比输出的大小。考虑到小范围的字符和多余的括号,我猜测解决方案实际上将压缩得很好。
乌里·格兰塔

1
@ mbomb007我没有尝试清除它,并且我认为当前状态的代码已损坏-尝试取消注释一些内容:gist.github.com/orlp/878da16b5b7c650ebd09
orlp
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.