这是一项任务,灵感来自着名的英国电视游戏节目Countdown.即使不了解游戏,挑战也应该非常明确,但随时可以要求澄清.
如果你想看到这款游戏的动态片段,请查看此YouTube视频片段.它拥有1997年美妙的已故理查德怀特利.
您将获得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#解决方案 - 当我有东西时会将它发布在这里!
请以下列格式发布所有答案,以便于比较:
语言
字符数:???
完全混淆的功能:
Run Code Online (Sandbox Code Playgroud)(code here)清除(理想评论)功能:
Run Code Online (Sandbox Code Playgroud)(code here)关于算法/聪明的快捷方式的任何注释.
我需要在给定列表上生成排列.我设法做到这一点
let rec Permute (final, arr) =
if List.length arr > 0 then
for x in arr do
let n_final = final @ [x]
let rest = arr |> List.filter (fun a -> not (x = a))
Permute (n_final, rest)
else
printfn "%A" final
let DoPermute lst =
Permute ([], lst)
DoPermute lst
Run Code Online (Sandbox Code Playgroud)
这段代码存在明显的问题.例如,列表元素必须是唯一的.而且,这与我在任何其他语言中生成直接实现时使用的方法相同.有没有更好的方法在F#中实现它.
谢谢!