Напишите программу, которая принимает данные, такие как:
n,k
который затем вычисляет:
и затем печатает результат.
Числовой пример:
Входные данные:
5,2
Внутренние вычисления:
Печатная продукция:
10
Я хотел бы увидеть ответ, который превосходит мое решение на Python из 65 символов, но все языки, безусловно, приветствуются.
Вот мое решение:
n,k=input();f=lambda x:+(x<2)or x*f(x-1);print f(n)/(f(k)*f(n-k))
Редактировать:
Я признаю, что этот вопрос из головоломки математической комбинации сайта Codegolf . Я знаю, что мой ответ может показаться, что в нем не так много прогресса, но лидеры этой головоломки решили его почти вдвое меньше персонажей.
Текущие минимальные числа символов по языку:
Perl: 35
Рубин: 36
Python: 39
PHP: 62
code-golf
combinatorics
Backus
источник
источник
Ответы:
APL, 3 байта
Или для тех, чей браузер не рендерит выше, в рендеринге ASCII:
источник
n,k
вводом, вы должны сделать!/⌽⎕
.R (11 символов)
источник
С 96
С I / O (который занимает около 34 символов). Добавлена пара новых строк, чтобы сделать его читабельным.
Теперь, если вы меня извините, у меня есть ASCII и я выберу k ракет, чтобы поймать.
источник
GolfScript, 17 символов
Это решение правильно обрабатывает такие случаи, как k = 0 или k = 1.
Факториально-подобная часть основана на предыдущем ответе .
источник
GolfScript 21
В частности, в GolfScript отсутствует реальная факториальная функция, однако это, должно быть, самая злая манипуляция с данными, которую я когда-либо делал, это требует трассировки стека:
«5,2» Данные в стеке от ввода.
~
Обратите внимание, что команда Eval - это оператор, который превращает число в массив.[0 1 2 3 4] 2
~
Двоичные нет.[0 1 2 3 4] -3
)
Приращение.[0 1 2 3 4] -2
>
Возьмите конец массива, -2 в качестве параметра, чтобы получить последние 2 элемента.[3 4]
.
Двойной элемент.[3 4] [3 4]
,
Длина массива.[3 4] 2
,
Превратить число в массив.[3 4] [0 1]
]
Создать массив.[[3 4] [0 1]]
{{)}%{*}*}
Блок кода.[[3 4] [0 1]] {{)}% {*} *}
%
Выполнить блок один раз для каждого элемента массива. Следующая часть демонстрирует только первый цикл.[3 4]
{)}%
Увеличивать каждый элемент массива.[4 5]
{*}
Блок, содержащий команду умножения.[4 5] {*}
*
«Сложите» массив с помощью команды block, то есть в этом случае создайте произведение всех элементов.20
После завершения большого цикла он возвращает массив с результатами.
[20 2]
~
Разобрать массив.20 2
/
дивизион.10
источник
Рубин 1.9,
5246 (42) персонажейЕсли stderr игнорируется:
Ruby 1.8, 43 символа, без дополнительного вывода в stderr:
Редактирование:
источник
Python (56)
Неуправляемый код и некоторые объяснения ярлыка для вычисления биномиального коэффициента. (Примечание: есть некоторая информация, которую я просто не понял, чтобы перейти к версии с 39 символами; я не думаю, что такой подход приведет вас туда.)
источник
*
для анализа входных данных вида4545 78
?*
в этом.4545 78
не является допустимым выражением Python, поэтомуinput()
вызоветSyntaxError
. Этот трюк целиком и полностью зависит от поставленной задачиx,y
. Если бы у вас была функция, которая читалаx y
и возвращала кортеж, то вы могли бы использовать ее*
просто отлично.RPL (4)
(используя встроенную функцию)
источник
Windows PowerShell, 57
источник
J,
333635 символов ввода, анализа и вывода. Другой символ
!
,, n выбрать k.На данный момент у меня нет Windows для тестирования, но я считаю, что она должна работать там.
источник
Q, 32 символа
источник
Perl 6 (55)
источник
RPL (22)
(без использования встроенной функции COMB)
источник
Q (
5045)Вы можете сбрить несколько символов из вышеперечисленного, удалив лишние скобки и используя 1 * / вместо prd.
источник
Mathematica 12
Простая, встроенная функция.
источник
Perl 6 ,
2516 байт-9 байт благодаря nwellnhof
Попробуйте онлайн!
Анонимная функция, которая принимает два числа и возвращает int. Это использует встроенный
combinations
и преобразует возвращенный список в int.источник
combinations
взять номер вместо спискаPHP (71
79)источник
Python (54)
По сути то же самое, что и вышеупомянутый Python, но я сбрасываю четыре байта, опуская
из определения функции. Однако это приводит к тому, что функция возвращает True вместо 1, если k = 0, но это можно исправить путем умножения на 1 перед печатью, поскольку 1 * True = 1, добавляя, таким образом, два байта.
источник
J, 11 символов
Принимает ввод с клавиатуры.
источник
Хаскелл (80)
Но если
x y
разрешен ввод в формате, а не в форматеx,y
, это 74 символа:источник
Скала 54
источник
Python (52)
Улучшение от двух других, используя
print+
для преобразования результатаf
отboolean
кint
в случаеk==0
.До сих пор не знаю, как уменьшить его до 39, интересно, используют ли они лямбду вообще.
источник
(Оператор OP только слабо определил метод / формат ввода и вывода, поэтому следующее представляется приемлемым.)
Sage Notebook (
39 4140)В текущей ячейке
где ввод в форму
n,k
вводится и оценивается в предыдущей ячейке. Это моделирует «ввод из командной строки», назначая его_
(аналогично аргументам командной строки).Sage Notebook (
42 4443)В качестве альтернативы, используя «ввод из источника» (с
x=
добавлением к партитуре только символов и новой строки), например,Оба этих подхода, очевидно, являются побочным продуктом более ранних ответов других.
источник
Tcl , 80 байт
Попробуйте онлайн!
источник
Javascript, 27 байт
Сначала мои собственные 35-байтовые решения:
Или, альтернативно,
Первый работает рекурсивно, с простым
(n,k) = (n-1,k) + (n-1,k-1)
правилом. Второй использует это(n,k) = (n-1,k-1) * n/k
.РЕДАКТИРОВАТЬ
Я только что заметил решение от Arnould в дубликате этого:
Что на 8 байтов меньше (27 байтов)
источник
TI-BASIC, 16 символов (8 байт)
Вход представляет собой список длиной 2 дюйма
Ans
.Выходные данные являются результатом формулы, определенной здесь .
Если вышеуказанного решения недостаточно, то также работает следующее решение 35 символов (24 байта) :
Примечание: TI-BASIC - это токенизированный язык. Количество символов не равно количеству байтов.
источник