Code Golf: Число Фробениуса

12
задан 6 revs, 3 users 69% 27 December 2012 в 10:36
поделиться

9 ответов

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
4
ответ дан 2 December 2019 в 05:26
поделиться

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] .

1
ответ дан 2 December 2019 в 05:26
поделиться

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

3
ответ дан 2 December 2019 в 05:26
поделиться

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"

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

2
ответ дан 2 December 2019 в 05:26
поделиться

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

Вызов с

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

Пример

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

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

9
ответ дан 2 December 2019 в 05:26
поделиться

FrobeniusScript 5 символов

solve

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

Нет параметров, интерпретатор обработает это:

$ echo solve > myProgram  
$ frobeniusScript myProgram
6
9
20
^D
Your answer is: 43
$ exit
-4
ответ дан 2 December 2019 в 05:26
поделиться

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

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

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

Вызвать с

f[6, 9, 20]

43
5
ответ дан 2 December 2019 в 05:26
поделиться

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 .

6
ответ дан 2 December 2019 в 05:26
поделиться

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 #, чем это, но это то, что я придумал.

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

2
ответ дан 2 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: