Кто не любит перестановки, верно? Я знаю, они потрясающие - так весело!
Ну, почему бы не принять это удовольствие и сделать его веселее ?
Вот проблема:
Учитывая ввод в точной форме:, nPr
где n
- пул, взятый из и r
количество выборок из этого пула (и n
и r
являются целыми числами), выведите / верните точное количество перестановок. Для тех из вас, кто немного разбирается в терминологии: перестановка, def. 2а .
Тем не менее, вот где задача вступает в игру (делает это не слишком легко):
Вы не можете использовать какую-либо встроенную библиотеку, структуру или метод для своей функции перестановки. Вы не можете использовать метод факториала, метод перестановки или что-либо подобное; Вы должны написать все сами.
Если необходимы дальнейшие разъяснения, пожалуйста, не стесняйтесь сообщить мне в комментариях, и я буду действовать соответственно.
Вот пример ввода / вывода:
Функция образца permute(String) -> int
Входные данные:
permute("3P2")
Выход:
6
Это код-гольф, поэтому выигрывает самый короткий код!
источник
split
чтобы разделить вход наP
? Как насчет функции, которая преобразует строку в число?0 <= r <= n
?Ответы:
CJam,
1514 байтовПопробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
Perl, 27 байт
Считая Шебанг как 4, ввод берется из стандартного ввода.
Образец использования
источник
l61
?$\
чтобы1
(полукокс 49, восьмеричный 61).Haskell,
7166 байтДовольно простые вещи: разделите на 'P', затем возьмите произведение между (n-k + 1) и n.
Спасибо Ними за их идею использовать шаблонные ограждения, а не
where
пункт, он сбрил 5 байтов.источник
Минколанг 0,11 ,
132519 байтовСпасибо Sp3000 за предложение этого!
Попробуй это здесь.
объяснение
Здесь используется тот же алгоритм, что и у Алекса:
n P k
=n(n-1)(n-2)...(n-k+1)
.источник
Юлия,
635848 байтовЭто создает безымянную функцию, которая принимает строку и возвращает целое число. Чтобы назвать его, дайте ему имя, например
f=s->...
.Ungolfed:
При этом используется тот факт, что число перестановок равно n ( n -1) ( n -2) ... ( n - k +1).
Сохранено 10 байтов благодаря Glen O!
источник
Int
, так что вы можете просто использоватьmap(parse,...)
.Int
было необходимо в этой ситуации. Спасибо!Утилиты Bash + Linux, 33
jot
производит последовательностьr
целых чисел, начиная сn-r+1
, и разделяет их с*
. Это выражение используетсяbc
для арифметической оценки.источник
MATLAB, 54 байта
Пытался сделать его меньше, но одна из вещей, с которыми MATLAB действительно плохо справляется, это получение информации. Требуется 32 символа только для того, чтобы получить два числа из входной строки!
Достаточно понятный код. Получить ввод в форме,
%dP%d
где% d является целым числом. Разделите это наn
иr
. Затем отобразите произведение каждого целого числа в диапазонеn-r+1
доn
. Интересно, что это работает даже для того, чтобыxP0
дать правильный ответ 1. Это потому, что в MATLABprod()
функция возвращает 1, если вы пытаетесь создать пустой массив. Всякий раз, когдаr
ноль, диапазон будет пустым массивом, поэтому мы получаем 1.Это также прекрасно работает с Octave . Вы можете попробовать это онлайн здесь .
источник
Javascript,
5957 байтисточник
Java (594 - байт)
источник
J, 23 байта
Анонимная функция. Пример:
Объяснение:
Используемая мной функция « стоп» может граничить со счетом как со встроенной ... Она лежит где-то между общностью оператора умножения и спецификой факториального оператора.
источник
APL, 23
Принимает строку в качестве аргумента. Объяснение:
источник
⎕ML←3
в Dyalog.Python 2, 66
Довольно просто. Обрабатывает ввод числа как
a,b
. Сохраняет работающий продукт какP
, который умножается на первыеb
членыa, a-1, a-2, ...
.источник
input()
не может привести к ошибке."3P2"
, которые, как мне кажется, обычно разрешены, но здесь задача говорит «ввод в точной форме», поэтому я изменяю его на функцию, которая принимает строку.TI-BASIC, 52 байта
В TI-BASIC есть функция «произведение списка», поэтому обойти ограничения на встроенные функции не так уж сложно. Тем не менее, TI-BASIC не поддерживает пустые списки, поэтому нам нужно
Чтобы извлечь два числа, я извлекаю первое число как подстроку. Это дорого ; занимает всю вторую строку. Чтобы избежать необходимости делать это снова для второго числа, я устанавливаю переменную P на это число и вычисляю всю строку, используя
expr(
, а затем делю на P².Наконец, я беру случайную перестановку списка между двумя числами (стараясь добавить одно ко второму числу) и беру продукт.
источник
Уроборос ,
4745 байтНекоторые из них довольно уродливы - я думаю, что это может быть дальше в гольфе.
Каждая строка кода в Уроборосе представляет собой змею, которая ест свой хвост.
Змея 1
S
переключается на общий стекr.r
читает одно число, дублирует его и читает другое. (Нечисловые символы, такиеP
как пропускаются.) Вычитает-
два. Если вход был7P2
, у нас теперь7
,5
в общем стеке. В заключение,1(
ест финальный персонаж змеи. Поскольку это символ, на котором находится указатель инструкции, змея умирает.Змея 2
)s
ничего не делает в первый раз..!+
дублирует вершину стека snake 2, проверяет, равен ли он нулю, и, если это так, добавляет 1. На первой итерации, стек пуст и обрабатывается так, как если бы он содержал бесконечные нули, так что это толкает1
; на более поздних итерациях стек содержит ненулевое значение, и это не имеет никакого эффекта.Далее
S
переключаемся на общий стек, где у нас есть номерn
и счетчик для расчета продукта.1+
увеличивает счетчик..@@.@\<!
дублирует как числа, так и нажимает 1, еслиn
все еще больше или равно счетчику, 0 в противном случае.@@*Y
затем умножает счетчик на эту величину и копирует копию в стек змеи 2.s.!+
переключается обратно в стек Snake 2 и использует тот же код, что и раньше, чтобы преобразовать верхнее число в 1, если оно было 0, и оставить его таким же, в противном случае. Затем*
умножает результат на частичное произведение, которое находилось в этом стеке.Теперь вернемся к общему стеку (
S
), продублируем counter-or-zero (.
) и дважды обнуляем его (!!
), чтобы превратить ненулевой счетчик в 1.4*.(
Умножаем это на 4, дублируем и съедаем столько символов из конец змеи.(
сгорают, и управление возвращается к началу кода. Здесь)
регургитирует четыре символа,s
переключается обратно в стек Snake 2, и выполнение продолжается.n
, у нас в стеке 0, и ничего не съедено.sn
переключается на стек Snake 2 и выводит верхнее значение в виде числа; затем1(
ест последний символ и умирает.В результате продукт
(r+1)*(r+2)*...*n
рассчитывается и выводится.Попробуйте это
Показать фрагмент кода
источник