相关疑难解决方法(0)

Code Golf:倒数游戏

挑战

这是一项任务,灵感来自着名的英国电视游戏节目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#解决方案 - 当我有东西时会将它发布在这里!


格式

请以下列格式发布所有答案,以便于比较:

语言

字符数:???

完全混淆的功能:

(code here)
Run Code Online (Sandbox Code Playgroud)

清除(理想评论)功能:

(code here)
Run Code Online (Sandbox Code Playgroud)

关于算法/聪明的快捷方式的任何注释.


algorithm math code-golf permutation

36
推荐指数
2
解决办法
5771
查看次数

F#排列

我需要在给定列表上生成排列.我设法做到这一点

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#中实现它.

谢谢!

f#

10
推荐指数
3
解决办法
4745
查看次数

标签 统计

algorithm ×1

code-golf ×1

f# ×1

math ×1

permutation ×1