【发布时间】:2011-06-02 23:25:59
【问题描述】:
挑战
这里是任务,灵感来自著名的英国电视游戏节目Countdown。即使没有任何游戏知识,挑战也应该很清楚,但请随时要求澄清。
如果您想观看此游戏的实际操作片段,请查看this YouTube clip。它以 1997 年出色的已故理查德·怀特利 (Richard Whitely) 为特色。
给您 6 个数字,从集合 {1, 2, 3, 4, 5, 6, 8, 9, 10, 25, 50, 75, 100} 中随机选择,以及一个介于 100 之间的随机目标数字和 999. 目的是使用六个给定的数字和四个常见的算术运算(加法、减法、乘法、除法;所有有理数)来生成目标 - 或尽可能接近任一侧。每个数字最多只能使用一次,而每个算术运算符可以使用任意次数(包括零)。请注意,使用多少个数字并不重要。
编写一个函数,接受目标数字和 6 个数字的集合(可以表示为列表/集合/数组/序列)并以任何标准数字符号(例如中缀、前缀、后缀)返回解。该函数必须始终将最接近的结果返回给目标,并且必须在标准 PC 上最多运行 1 分钟。请注意,在存在多个解决方案的情况下,任何一个解决方案都足够了。
例子:
{50, 100, 4, 2, 2, 4},目标 203
例如100 * 2 + 2 + (4 / 4) (精确)
例如(100 + 50) * 4 * 2 / (4 + 2) (精确){25, 4, 9, 2, 3, 10},目标 465
例如(25 + 10 - 4) * (9 * 2 - 3) (精确){9, 8, 10, 5, 9, 7},目标 241
例如((10 + 9) * 9 * 7) + 8) / 5 (精确){3, 7, 6, 2, 1, 7},目标 824
例如((7 * 3) - 1) * 6 - 2) * 7 (= 826; 减 2)
规则
除了问题陈述中提到的以外,没有其他限制。您可以用任何标准语言编写函数(不需要标准 I/O)。一如既往的目标是用最少的代码字符解决任务。
这么说,我可能不会简单地接受最短代码的答案。我还将研究代码的优雅性和算法的时间复杂度!
我的解决方案
当我找到空闲时间时,我正在尝试 F# 解决方案 - 有事时会在这里发布!
格式
为了便于比较,请按以下格式发布所有答案:
语言
字符数:???
完全混淆的函数:
(code here)清除(最好是注释)功能:
(code here)关于它所采用的算法/聪明快捷方式的任何注释。
【问题讨论】:
-
如何处理部门?整数除法还是浮点数?
-
我们曾经用一副纸牌玩这个。为数字发 4 张牌(J=11,Q=12,K=13)。然后为目标处理2个数字:target=10*t1+t2,所以最多可以达到13*11。你几乎总是可以这样做,而对于其他情况,我一直想要一个程序来验证没有解决方案。
-
@Noldorin 如果输入不能任意增长,那么大 O 表示法时间约束是没有意义的。
-
我认为可以证明没有
O(n+k)解决方案。我认为也没有多项式时间解决方案。这闻起来就像一个 NP Hard 问题。 -
我看不出有任何方法可以在多项式时间内准确地做到这一点。想象一下,我给了你一个固定的表达式,比如 1+2*3+4*5+6,你所要做的就是决定括号到哪里最接近目标数字,那仍然是 (n-1)!选择(执行操作的顺序),这不是多项式。原来的问题比这要糟糕得多。
标签: algorithm math permutation code-golf