Вызов
В этом задании вы вычислили количество способов, которыми мы можем распределить шарики А в ячейки В, причем каждая ячейка имеет хотя бы один шарик.
Входы A и B задаются в одной строке, разделенной пробелом, входы завершаются EOF.
Вы можете проверить свои решения здесь .
вход
0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11
Выход
1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400
Ограничения
- Каждые А и В могут быть различимы.
- 0 <= A, B <= 20
- Вы можете использовать любой язык на ваш выбор
- Самое короткое решение побеждает!
code-golf
math
combinatorics
донкихотский
источник
источник
S(n,0)
это1
еслиn=0
и в0
противном случае). Если хотите, я могу найти ссылку на более сильное утверждение, что Stirling2 находится в ассоциативной подгруппе экспоненциальной группы Риордана.Ответы:
JavaScript (90
93)http://jsfiddle.net/RDGUn/2/
Очевидно, что любой математический язык, такой как APL, победит меня из-за многословия синтаксиса и отсутствия встроенных математических конструкций :)
Редактировать Также у меня нет никакой связанной с вводом функциональности, кроме параметров, переданных в функцию, я не уверен, как использовать стандартный ввод с JavaScript ...
Изменить: перейти
i--
вm=m*
выражение; двигатьсяn*=-1
вfor
; начатьr=1
комбинировать задания и удалить посторонние по возвращении. (сохранить 3 символа)источник
readline
иprint
. Я не знаю, что здесь используют другие.prompt
иalert
являются «стандартными» JavaScript для io, так как они являются типичными блокирующими io-вызовами, несмотря на тот факт, что вы никогда не будете использовать блокировку io в JavaScript.Golfscript -
56 50 49 48 41 40 3837 символовПримечание: это обрабатывает несколько строк ввода, быстро (1/8 секунды, чтобы выполнить тестовые случаи) и не прерывается для любого легального ввода.
(Первая версия была также моей первой в истории программой Golfscript; спасибо eBusiness за указание на несколько уловок, которые я пропустил).
Чтобы сделать этот пост полезным, вот объяснение того, как оно работает. Начнем с повторения
f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
. Комбинатически это можно понимать как выражение, что для помещенияn
различимых шаров вk
различимые ведра так, чтобы в каждом ведре был хотя бы один шарик, вы выбираете одно изk
ведер для первого шарика (k *
), а затем либо оно будет содержать хотя бы еще один шарик (f(n-1, k)
). или не будет (f(n-1, k-1)
).Значения, полученные в результате этого, образуют сетку; принимая
n
в качестве индекса строки иk
в качестве индекса столбца и индексации как от 0, он начинаетсяИтак, обращаясь к программе,
разбивает входные данные на строки, а затем для каждой строки оценивает его, помещает
n
и помещаетk
в стек, а затем вызывает<<STUFF>>
, что выглядит следующим образом:Это вычисляет первые
k+1
записиn+1
th-й строки этой сетки. Изначально стек естьn k
.),
дает стекn [0 1 2 ... k]
{!}%
дает стек,n [1 0 0 ... 0]
где естьk
0.\{ <<MORE STUFF>> }*
приводитn
к вершине и делает это количество раз, которое мы выполняем<<MORE STUFF>>
.Наш стек в настоящее время является строкой таблицы:
[f(i,0) f(i,1) ... f(i,k)]
0.@
помещает пару нулей перед этим массивом. Первый будет,j
а второй будетf(i,j-1)
.{ <<FINAL LOOP>> }/
перебирает элементы массива; для каждого он помещает его на вершину стека и затем выполняет тело цикла..@+2$*@)@
Скучно манипуляции стека принимать... j f(i,j-1) f(i,j)
и выход... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
щелчки от левого надk+1 f(i,k)
и собирает все в массив, готовый к следующему обходу цикла.Наконец, когда мы сгенерировали
n
th-ю строку таблицы,)p;
берём последний элемент, печатаем его и отбрасываем оставшуюся часть строки.Для потомков три 38-символьных решения по этому принципу:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/
источник
[0]
->1,
, пробел после zip можно просто удалить, а другой пробел можно удалить, если вы просто храните в операторе вместо k. Я еще не прошел через ваш код, но я подозреваю, что вы можете избежать использования только значения, не помещая его в массив в некоторых местах.J, 40
Например
<1сек для всех тестовых случаев.
Правки
-/
вместо чередования(1 _1)*
(идея JB)1x+
источник
1x+
, но это вернет мне только 1 персонажа, а вы взяли 5!Обыкновенный Лисп (83)
Кажется, что должен быть более короткий способ проверки базовых случаев, но ничего не происходит со мной.
источник
J от 38 до 42
В зависимости от ваших строгих предпочтений в отношении интерактивных языков и выходной презентации, выберите из спектра решений J:
4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
запустите jconsole, введите его, затем вставьте ввод (в конце нажмите Cd). Вы заметите, что выходные данные разделены пробелами (J является векторным языком, он выполняет вычисления для всего ввода в целом и возвращает его как одномерный вектор, представление которого по умолчанию находится в одной строке). Я считаю, что все в порядке, дух этой проблемы - вычисления, а не представление. Но если вы настаиваете на использовании новых строк:
4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
замена Compose (
&
) на Under (&.
) возвращает вектор строк, представление которых заканчивается на отдельных строках.4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
запустить из командной строки как
$ jconsole balls.ijs < balls.in
Если вы проголосовали за это, вы, возможно, захотите и отдать должное решению Eelvex .
источник
&.
чтобы он правильно работал в интерактивном режиме.4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
. 39 символовGolfScript -
453836 символовОтношение рекуррентности грязной реализации средней силы (
3836 символов):Отношение рекуррентности, которое я украл из решения Питера Тейлорса, выглядит так:
f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )
В особых случаях, если любая из переменных равна 0.
Моя реализация не использует предыдущие результаты, поэтому каждая функция вызывает переход к двум новым вызовам, если не был достигнут ни один из нулевых случаев. Это дает наихудший случай вызова функции 2 ^ 21-1, который занимает 30 секунд на моей машине.
Решение серии Light-force (45 символов):
источник
J, 55 символов
wd
). Вход на стандартный вывод, вывод на стандартный вывод.Скрипт Bash Test:
источник
wd
?echo
, который определяется как0 0&$@(1!:2&2)
. Я не уверен, что это значит, но он делает что-то вроде довольно печатных элементов ранга 1 с разрывом строки. (Я только сейчас заметил, что использует 2, а не 4 ... Я думаю, что он по-прежнему идет на стандартный вывод в консольном режиме, по крайней мере.)<< was unexpected at this time.
Извините , я новичок вход J, я всегда использовал его в консольном режиме.Golfscript - 26 символов
Предупреждение: случай 12 4 требует много памяти (хотя и не так много, как ответ ниже) и требует много времени для запуска
Очевидно, у этого ответа есть некоторые проблемы, но я оставлю его здесь, потому что комментарии относятся к нему, а ответ mellamokb основан на нем.
Golfscript - 24 символа
Предупреждение: корпус 12 4 требует много памяти и требует много времени для запуска
источник
0 0
должен производить1
;0 k
для любого другогоk
следует производить0
;n 1
ибоn > 0
должен производить1
.Python 140 символов
источник
постоянный ток, 100 символов
Увы, похоже, что dc не поддерживается ideone. Там может быть персонаж или два еще выжать, но это время сна.
Примечание: он поддерживает несколько строк ввода, имеет достаточную точность, чтобы дать правильный вывод даже для
20 19
(проклинаю вас, Perl, за то время, которое я потратил на отладку своего решения!), И дает правильный вывод для0 0
.Предложения от Nabb позволяют сократить хотя бы до
ценой оставления мусора в стеках регистра (и, следовательно, нехватки памяти, если мы вычисляем миллиарды ответов).
источник
l11
анализируется какl1 1
(вы можете использоватьK
в качестве одиночного символьного токена,0
если вы не собираетесь менять точность в любом случае). Вы можете изменить цикл ввода на?[...?z1=4]
. Вы можете вставить макрос в регистр1
. И, возможно, вы можете сохранить кучу других символов в целом, но я подожду, пока он будет короче, чтобы понять его.Golfscript (28
3137)~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,
Модификация для
gnibbler
решения GolfScript. Я думаю, что это рабочее решение - проверено с помощью [3,2], [4,2], [6,3] и [9,2] с правильными ответами. (Я использовал$
и@
для переменных, чтобы сжать пространство вокругbase
ключевого слова).Есть две проблемы с
gnibbler
текущим решением.редактировать
~:@\?:$,{$+}%{@base(;@,\-,0=},,
Лучшее решение еще! Не нужно увеличивать, просто добавьте ко всем числам, чтобы они начинались с [1], и никакие цифры не будут отсутствовать (включая добавление слева в 0), когда вы удалите эту первую цифру. Это решение должно работать и было протестировано с такими же записями выше. Это также намного быстрее, потому что мы не увеличиваем значение, прежде чем брать показатель степени для генерации массива (но все же страдает от той же проблемы производительности / памяти для большего ввода).
Редактировать : использовать
gnibbler
идею перемещения$
внутри фильтра вместо дополнительного шага. (сохранить 3 символа).источник
0 0
.n 1
любом n, заставляет его висеть. хм ..05AB1E , 19 байтов
ПРИМЕЧАНИЕ: это очень медленно, и время уже истекло
12 4
. Тем не менее, он работает как задумано.Посмотрим, смогу ли я придумать альтернативный метод, который работает для всех тестовых случаев в разумные сроки.Ниже приведена намного более быстрая версия, которая запускает все тестовые примеры менее чем за секунду.Попробуйте онлайн или проверьте еще несколько (из меньших) тестовых случаев .
Объяснение:
05AB1E , 29 байт
Вот гораздо более быстрая версия, которая работает для всех тестовых случаев примерно за 0,5 секунды на TIO:
Порт @mellamokb ответ JavaScript , так что не забудьте поднять его!
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
ПРИМЕЧАНИЕ:
0 0
в этом случае работает для крайнего случая (в отличие от ответа JavaScript, из которого я перенес этот метод), потому чтоL
встроенная программа создаст список[0,1]
.источник