Подтвердить что ты не робот

Код Гольф: Номер Фробениуса

Напишите кратчайшую программу, которая вычисляет число Фробениуса для заданного набора положительных чисел. Число Фробениуса является наибольшим числом, которое не может быть записано как сумма положительных кратных чисел в множестве.

Пример: для набора размеров Chicken McNugget TM [6,9,20] число Фробениуса равно 43, так как нет решения для уравнения a * 6 + b * 9 + c * 20 = 43 (с a, b, c >= 0), а 43 - наибольшее значение с этим свойством.

Можно предположить, что для данного множества существует число Фробениуса. Если это не так (например, для [2,4]), особого поведения не ожидается.

Литература:

[Изменить] Я решил принять версию GolfScript. Хотя версия MATHEMATICA может считаться "технически правильной", она, несомненно, выиграет от конкуренции. Тем не менее, меня также впечатляют другие решения, особенно Ruby (что очень мало для языка общего назначения).

4b9b3361

Ответ 1

GolfScript 47/42 символов

Более быстрое решение (47).

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

Медленное решение (42). Проверяет все значения до произведения каждого числа в наборе...

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

Пример ввода-вывода:

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

Ответ 2

Mathematica 0 символов (или 19 символов, считающих команду вызова)

Вызывать wtih

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

Пример

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

Это запись?:)

Ответ 3

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, используя Symbol#to_proc в $*.map, вставляя m и сокращая его вычисление, свернув массив.
Изменить 2: Заменять .times на .map, торгуется .to_a для ;i.

Ответ 4

ПРОГРАММА Mathematica - 28 символов

Ну, это РЕАЛЬНАЯ (ненужная) программа. Как видно из другой записи Mathematica, вы можете вычислить ответ без написания программы... но здесь это

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

Вызвать

f[6, 9, 20]

43

Ответ 5

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. так как это моя первая подача кода для гольфа, я не уверен, как обрабатывать ввод, какие правила?

Ответ 6

Perl 105 107 110 119 122 127 152 158 символы

Последнее редактирование: подходящее вам соединение!

$h{0}=$t=1;$t*=$_ [email protected];for$x(1..$t){$h{$x}=grep$h{$x-$_},@ARGV}@b=grep!$h{$_},1..$t;print [email protected],"\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);

Извлеките все записи UNMARKED. Это кандидаты Фробениуса...

print pop @b, "\n"

... и последнее из них самое высокое - это наше число Фробениуса.

Ответ 7

С#, 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++;}}}}

Я уверен, что здесь есть более короткое решение С#, но это то, что я придумал.

Это полная программа, которая принимает значения в качестве параметров командной строки и выводит результат на экран.

Ответ 8

Haskell 153 символа

Другой подход к решению Хаскелла. Я ранга новичок в 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].

Ответ 9

FrobeniusScript 5 символов

solve

К сожалению, еще не существует компилятора/интерпретатора для этого языка.

Нет параметров, интерпретатор будет обрабатывать это:

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