12

编写最短的程序,计算给定正数集的 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(它对于通用语言来说非常短)。

4

9 回答 9

9

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

调用

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

例子

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

是记录吗?:)

于 2010-08-12T18:09:34.193 回答
6

红宝石 100 8680 个字符

(不需要换行符)调用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是与ints相同的数组,然后用于收集所有可以制作的数字;eval(a*"*")是产品,要检查的最大数量。

在 Ruby 1.9 中,您可以通过替换"*"?*.

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

于 2010-08-12T22:26:09.027 回答
5

Mathematica 程序 - 28 个字符

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

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

调用

f[6, 9, 20]

43
于 2010-08-13T00:20:29.650 回答
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
于 2010-08-12T09:42:02.127 回答
3

Haskell 155 chars
该函数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

PS因为这是我第一次提交代码高尔夫我不知道如何处理输入,规则是什么?

于 2010-08-12T08:37:40.033 回答
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);

提取所有未标记的条目。这些是 Frobenius 候选人...

print pop @b, "\n"

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

于 2010-08-12T18:24:22.957 回答
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# 解决方案,但这就是我想出的。

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

于 2010-08-13T23:11:03.203 回答
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]

于 2010-08-12T09:20:56.520 回答
-4

FrobeniusScript 5 个字符

solve

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

没有参数,解释器将处理:

$ echo solve > myProgram  
$ frobeniusScript myProgram
6
9
20
^D
Your answer is: 43
$ exit
于 2010-08-13T00:25:32.477 回答