Code Golf:Frobenius Number

时间:2010-08-12 07:02:20

标签: language-agnostic code-golf rosetta-stone

编写计算给定正数集的Frobenius数的最短程序。 Frobenius数是最大数,不能写为集合中数字的正数之和。

示例:对于Chicken McNugget TM 尺寸[6,9,20]的集合,Frobenius数为43,因为等式a的无解 * 6 + b * 9 + c * 20 = 43(a,b,c> = 0),43是具有此属性的最大值。

可以假设给定集合存在Frobenius数。如果不是这种情况(例如[2,4]),则不会出现特定的行为。

参考文献:

[编辑] 我决定接受GolfScript版本。虽然MATHEMATICA版本可能被认为是“技术上正确的”,但它显然会带来竞争的乐趣。也就是说,我也对其他解决方案印象深刻,尤其是Ruby(对于通用语言来说非常简短)。

9 个答案:

答案 0 :(得分:9)

Mathematica 0个字符(或19个计数调用命令的字符)

调用
FrobeniusNumber[{a,b,c,...}]

实施例

In[3]:= FrobeniusNumber[{6, 9, 20}]
Out[3]= 43

这是一张唱片吗? :)

答案 1 :(得分:6)

Ruby 100 86 80个字符

(不需要换行) 使用frob.rb 6 9 20

进行调用
a=$*.map &:to_i;
p ((1..eval(a*"*")).map{|i|a<<i if(a&a.map{|v|i-v})[0];i}-a)[-1]

就像Perl解决方案一样工作(除了更好:)。 $*是一个命令行字符串数组; a与int是相同的数组,然后用于收集可以生成的所有数字; eval(a*"*")是产品,是要检查的最大数量。

在Ruby 1.9中,您可以使用"*"替换?*来保存一个额外字符。

编辑:使用Symbol#to_proc中的$*.map缩短为86,内联m并通过折叠数组缩短其计算。
修改2:.times替换为.map,将.to_a换成;i

答案 2 :(得分:5)

Mathematica计划 - 28个字符

嗯,这是一个真实的(不必要的)程序。正如另一个Mathematica条目清楚地显示,你可以在不编写程序的情况下计算答案......但这里是

f[x__]:=FrobeniusNumber[{x}]

调用
f[6, 9, 20]

43

答案 3 :(得分:4)

GolfScript 47/42字符

更快的解决方案( 47 )。

~:+{0+{.1<{$}{1=}if|}/.!1):1\{:X}*+0=-X<}do];X(

慢速解决方案( 42 )。检查所有值,直到集合中每个数字的乘积...

~:+{*}*{0+{.1<{$}{1=}if|}/1):1;}*]-1%.0?>,

样本I / O:

$ echo "[6 9 20]"|golfscript frobenius.gs
43
$ echo "[60 90 2011]"|golfscript frobenius.gs
58349

答案 4 :(得分:3)

Haskell 155个字符 函数f完成工作并期望对列表进行排序。例如f [6,9,20] = 43

b x n=sequence$replicate n[0..x]
f a=last$filter(not.(flip elem)(map(sum.zipWith(*)a)(b u(length a))))[1..u] where
    h=head a
    l=last a
    u=h*l-h-l

P.S。因为这是我的第一个代码高尔夫提交,我不知道如何处理输入,有什么规则?

答案 5 :(得分:2)

Perl 105 107 110 119 122 127 152 158 个字符

最新编辑:复合作业对你有用!

$h{0}=$t=1;$t*=$_ for@ARGV;for$x(1..$t){$h{$x}=grep$h{$x-$_},@ARGV}@b=grep!$h{$_},1..$t;print pop@b,"\n"

说明:

$t = 1;
$t *= $_ foreach(@ARGV);

$t设置为所有输入数字的乘积。这是我们的上限。

foreach $x (1..$t)
{
  $h{$x} = grep {$_ == $x || $h{$x-$_} } @ARGV;
}

对于从1到$t的每个数字:如果它是输入数字之一,请使用%h哈希标记它;否则,如果从后面有一个标记的条目(差异是输入中的任何内容),请标记此条目。所有标记的条目都不是Frobenius数字的候选者。

@b=grep{!$h{$_}}(1..$t);

提取所有UNMARKED条目。这些是弗罗贝尼乌斯的候选人......

print pop @b, "\n"

......其中最后一个是最高的,是我们的Frobenius数字。

答案 6 :(得分:2)

C#,360个字符

using System;using System.Linq;class a{static void Main(string[]b)
{var c=(b.Select(d=>int.Parse(d))).ToArray();int e=c[0]*c[1];a:--e;
var f=c.Length;var g=new int[f];g[f-1]=1;int h=1;for(;;){int i=0;for
(int j=0;j<f;j++)i+=c[j]*g[j];if(i==e){goto a;}if(i<e){g[f-1]++;h=1;}
else{if(h>=f){Console.Write(e);return;}for(int k=f-1;k>=f-h;k--)
g[k]=0;g[f-h-1]++;h++;}}}}

我确信C#解决方案比这个更短,但这就是我想出来的。

这是一个完整的程序,它将值作为命令行参数并将结果输出到屏幕。

答案 7 :(得分:1)

Haskell 153个字符

对Haskell解决方案的不同看法。我是Haskell的新手,所以如果不能缩短,我会感到惊讶。

m(x:a)(y:b)
 |x==y=x:m a b
 |x<y=x:m(y:b)a
 |True=y:m(x:a)b
f d=l!!s-1where
 l=0:foldl1 m[map(n+)l|n<-d]
 g=minimum d
 s=until(\n->l!!(n+g)-l!!n==g)(+1)0

请使用,例如f [9,6,20]

答案 8 :(得分:-4)

FrobeniusScript 5个字符

solve

可悲的是,这种语言还没有任何编译器/解释器。

没有参数,翻译人员会处理:

$ echo solve > myProgram  
$ frobeniusScript myProgram
6
9
20
^D
Your answer is: 43
$ exit