首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码高尔夫:倒计时号码游戏

代码高尔夫:倒计时号码游戏
EN

Stack Overflow用户
提问于 2011-01-03 17:42:29
回答 1查看 6.6K关注 0票数 36

挑战

以下是英国著名电视游戏节目“倒计时”的启发任务。挑战应该是相当明确的,即使没有任何的游戏知识,但请随时要求澄清。

如果你想看到这个游戏的剪辑在行动,看看这个YouTube剪辑。它以1997年著名的已故理查德·怀特为特色。

给出了从集合{1,2,3,4,5,6,8,9,10,25,50,75,100}中随机选择的6个数字,以及100到999之间的随机目标数。其目的是使用六个给定的数字和四个常见的算术运算(加法、减法、乘法、除法;所有有理数)生成目标--或者尽可能接近任何一方。每个数字最多只能使用一次,而每个算术运算符则可以使用任意次数(包括零)。请注意,使用多少个数字并不重要。 编写一个函数,该函数接受目标数和6个数字的集合(可以表示为列表/集合/数组/序列),并以任何标准数字表示法(例如infix、前缀、后缀)返回解决方案。函数必须始终将最接近的结果返回到目标,并且必须在标准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#解决方案--当我有什么东西时,会在这里发布它!

格式化

为便于比较,请以下列格式张贴所有答案:

语言 字符数:? 完全模糊的功能: (代码在这里) 明确(理想的评论)功能: (代码在这里) 任何关于算法的注释/聪明的快捷键。

EN

回答 1

Stack Overflow用户

发布于 2011-01-19 00:50:32

红宝石1.9.2

字符数: 404

我现在放弃了,只要有确切的答案,它就能奏效。如果没有的话,要列举出所有的可能性都需要很长的时间。

完全混淆

代码语言:javascript
复制
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}"

破译

代码语言:javascript
复制
Coming soon

测试脚本

代码语言:javascript
复制
#!/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

输出

代码语言:javascript
复制
→ ./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)的函数基于以下一个:查找结构良好的托架的所有组合

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4586814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档