GolfScript 47/42 chars
Более быстрое решение (47)
~:+{0+{.1<{$}{1=}if|}/.!1):1\{:X}*+0=-X<}do];X(
Медленное решение (42). Проверяет все значения вплоть до произведения всех чисел в наборе...
~:+{*}*{0+{.1<{$}{1=}if|}/1):1;}*]-1%.0?>,
Sample I/O:
$ echo "[6 9 20]"|golfscript frobenius.gs
43
$ echo "[60 90 2011]"|golfscript frobenius.gs
58349
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]
.
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. поскольку это мой первый код для гольфа, я не уверен, как обрабатывать ввод, каковы правила?
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
; в противном случае, если есть отмеченная запись из более далекого прошлого (разница заключается в любом вводе), отметьте эту запись. Все отмеченные записи не могут быть числами Фробениуса.
@b=grep{!$h{$_}}(1..$t);
Извлечь все НЕМАРКИРОВАННЫЕ записи. Это кандидаты Фробениуса ...
print pop @b, "\n"
... и последний из них, самый высокий, - это наше число Фробениуса.
Вызов с
FrobeniusNumber[{a,b,c,...}]
Пример
In[3]:= FrobeniusNumber[{6, 9, 20}]
Out[3]= 43
Это запись? :)
FrobeniusScript 5 символов
solve
К сожалению, для этого языка еще не существует компилятора / интерпретатора.
Нет параметров, интерпретатор обработает это:
$ echo solve > myProgram
$ frobeniusScript myProgram
6
9
20
^D
Your answer is: 43
$ exit
Ну, это РЕАЛЬНАЯ (ненужная) программа. Как ясно показывает другая запись в системе Mathematica, вы можете вычислить ответ без написания программы... но вот она
f[x__]:=FrobeniusNumber[{x}]
Вызвать с
f[6, 9, 20]
43
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
- это тот же массив, что и ints, который затем используется для сбора всех чисел, которые могут быть составлены; eval (a * "*")
- это произведение, максимальное число для проверки.
В Ruby 1.9 вы можете сохранить один дополнительный символ, заменив "*"
на ? *
.
Редактировать: Сокращено до 86 с использованием символа # to_proc
в $ *. Map
, встраивая m
и сокращая его вычисление путем свертывания массива.
Edit 2: Заменено .times
на .map
, .to_a
заменено на ; i
.
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 #, чем это, но это то, что я придумал.
Это полная программа, которая принимает значения как параметры командной строки и выводит результат на экран.