挑战
以下是英国著名电视游戏节目“倒计时”的启发任务。挑战应该是相当明确的,即使没有任何的游戏知识,但请随时要求澄清。
如果你想看到这个游戏的剪辑在行动,看看这个YouTube剪辑。它以1997年著名的已故理查德·怀特为特色。
给出了从集合{1,2,3,4,5,6,8,9,10,25,50,75,100}中随机选择的6个数字,以及100到999之间的随机目标数。其目的是使用六个给定的数字和四个常见的算术运算(加法、减法、乘法、除法;所有有理数)生成目标--或者尽可能接近任何一方。每个数字最多只能使用一次,而每个算术运算符则可以使用任意次数(包括零)。请注意,使用多少个数字并不重要。 编写一个函数,该函数接受目标数和6个数字的集合(可以表示为列表/集合/数组/序列),并以任何标准数字表示法(例如infix、前缀、后缀)返回解决方案。函数必须始终将最接近的结果返回到目标,并且必须在标准PC上最多在1分钟内运行。注意,在存在多个解决方案的情况下,任何一个解决方案都足够了。
示例:
规则
除了问题陈述中提到的以外,没有进一步的限制。您可以用任何标准语言编写函数(标准I/O是不必要的)。目标始终是用最少的代码字符来解决任务。
这么说,我不能简单地用最短的代码来接受答案。我还将看到代码的优雅和算法的时间复杂性!
我的解决方案
当我找到空闲时间时,我正在尝试一个F#解决方案--当我有什么东西时,会在这里发布它!
格式化
为便于比较,请以下列格式张贴所有答案:
语言 字符数:? 完全模糊的功能: (代码在这里) 明确(理想的评论)功能: (代码在这里) 任何关于算法的注释/聪明的快捷键。
发布于 2011-01-19 00:50:32
红宝石1.9.2
字符数: 404
我现在放弃了,只要有确切的答案,它就能奏效。如果没有的话,要列举出所有的可能性都需要很长的时间。
完全混淆
def b a,o,c,p,r
o+c==2*p ?r<<a :o<p ?b(a+['('],o+1,c,p,r):0;c<o ?b(a+[')'],o,c+1,p,r):0
end
w=a=%w{+ - * /}
4.times{w=w.product a}
b [],0,0,3,g=[]
*n,l=$<.read.split.map(&:to_f)
h={}
catch(0){w.product(g).each{|c,f|k=f.zip(c.flatten).each{|o|o.reverse! if o[0]=='('};n.permutation{|m|h[x=eval(d=m.zip(k)*'')]=d;throw 0 if x==l}}}
c=h[k=h.keys.min_by{|i|(i-l).abs}]
puts c.gsub(/(\d*)\.\d*/,'\1')+"=#{k}"破译
Coming soon测试脚本
#!/usr/bin/env ruby
[
[[50,100,4,2,2,4],203],
[[25,4,9,2,3,10],465],
[[9,8,10,5,9,7],241],
[[3,7,6,2,1,7],824]
].each do |b|
start = Time.now
puts "{[#{b[0]*', '}] #{b[1]}} gives #{`echo "#{b[0]*' '} #{b[1]}" | ruby count-golf.rb`.strip} in #{Time.now-start}"
end输出
→ ./test.rb
{[50, 100, 4, 2, 2, 4] 203} gives 100+(4+(50-(2)/4)*2)=203.0 in 3.968534736
{[25, 4, 9, 2, 3, 10] 465} gives 2+(3+(25+(9)*10)*4)=465.0 in 1.430715549
{[9, 8, 10, 5, 9, 7] 241} gives 5+(9+(8)+10)*9-(7)=241.0 in 1.20045702
{[3, 7, 6, 2, 1, 7] 824} gives 7*(6*(7*(3)-1)-2)=826.0 in 193.040054095详细信息
用于生成括号对(b)的函数基于以下一个:查找结构良好的托架的所有组合
https://stackoverflow.com/questions/4586814
复制相似问题