Не путайте с Find the factorial!
Введение
Факториал целого числа n
можно вычислить как
Это относительно просто и ничего нового. Тем не менее, факториалы могут быть расширены до двойных факториалов , таких что
для четных чисел и
для нечетных чисел. Но мы не ограничены двойными факториалами. Например,
или
или
зависимости от начальное значение.
В итоге:
где
Или, на простом английском: вычитайте факториальное число из базового числа многократно и умножьте все получающиеся натуральные числа.
Соревнование
Напишите функцию, которая будет вычислять любой вид повторяющегося факториала для любого неотрицательного целого числа.
вход
Или
- Строка, содержащая неотрицательное целое число от основания до десяти, за которым следует 1 или более восклицательных знаков. Например,
"6!"
или"9!!"
или"40!!!!!!!!!!!!!!!!!!!!"
.
или
- Одинаковые значения представлены двумя целыми числами: одно неотрицательное базовое значение и одно положительное значение, представляющее счет факториала. Это можно сделать в соответствии с любым форматом из правил ввода / вывода по умолчанию.
Выход
Результат указанного расчета.
Вызов замечания
0!
равно1
по определению. Ваш код должен учитывать это.- Количество факториалов ограничено значением за пределами этого диапазона, вы можете выводить все что угодно. Кроме того , что является единственным исключением из этого правила.
0!
Примеры
Input Output
3!!! 3
0! 1
6! 720
9!! 945
10!!!!!!!! 20
40!!!!!!!!!!!!!!!!!!!! 800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41697106428257280000000000000000
Попробуй это с незакрытой реализацией Python: попробуй онлайн!
Основные пометки
- Это код-гольф , поэтому ответ, использующий наименьшее количество байтов на каждом языке, выигрывает.
- Применяются стандартные правила , правила ввода / вывода и лазейки .
- Пожалуйста, включите ссылку Try it Online, чтобы продемонстрировать, как работает ваш код.
- Пожалуйста, мотивируйте ваш ответ объяснением вашего кода.
0!
но примечания к вызову говорят, что факториальное число будет меньше или равно базовому значению.3!!!!!!!
не должно быть неопределенным - оно должно просто дать ответ3
. Это так же, как1!!=1
(не определено). Также в вашей входной спецификации сказано, что всегда будет хотя бы один!
, поэтому первый пример3
не соответствует спецификации.(3!)!
вместо этого, это удаляет термины из факториала. Это вводящее в заблуждение имя; Я пришел к выводу, что он будет неоднократно применять факториальную функцию в цепочке, и мне пришлось внимательно прочитать, чтобы увидеть, что это на самом деле. К счастью, вопрос объясняет это ясно. Лучшее имя может быть факториал шага или факториал шага или что-то.Ответы:
R , 33 байта
Попробуйте онлайн!
Обрабатывает , добавляя логическое отрицание .n=0 n
источник
ArnoldC ,
702 698634 байтаПопробуйте онлайн!
Переведено в псевдокод:
Примечание: ArnoldC имеет только один тип данных: 16-разрядное целое число со знаком. Поэтому я не могу проверить
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
случай.источник
c
Переменная фактически сохраняет значение сравнения междуn
и0
.Желе , 4 байта
Попробуйте онлайн!
Как? Учитывая и , он сначала генерирует диапазон (с ), затем вместе с ним сохраняет каждый элемент этого диапазона (поэтому ) и, наконец, умножает их, используя .n k n,⋯,1 k th n , n - k , n - 2 k , ⋯ , n - ⌊ n / k ⌋ kkth n,n−k,n−2k,⋯,n−⌊n/k⌋k
RṚ
m
P
источник
RṚ
m
P
r1mP
.APL (Dyalog Extended) , 7 байтов SBCS
Функция анонимного молчаливого префикса. Принимает в
[n,b]
качестве аргумента.Попробуйте онлайн!
1¨
по одному на каждый элемент аргумента;[1,1]
-\
накопленная разница;[n,n-b]
…
диапазон с использованием второго элемента левого аргумента в качестве индикатора шага, например,[9,7]
продолжается с5
×/
продуктисточник
Haskell , 21 байт
Попробуйте онлайн!
Объединение встроенной функции продукта с пошаговым перечислением диапазонов превосходит то, что я мог бы кодировать рекурсивно (даже при использовании flawr, сохраняющего байт).
22 байта
Попробуйте онлайн!
Вот решение, принимающее ввод в строковом формате, например
9!!
, которое мне кажется более интересным.42 байта
Попробуйте онлайн!
источник
n%a|n<1=1|m<-n-a=n*m%a
Pyth , 6 байт
Это все эквивалентные 6 байтов:
Попробуйте онлайн! (
*F:Q1E
)Или 11 байтов , принимая входные данные в виде строки:
Тестирование.
источник
JavaScript (ES6), 21 байт
Принимает вход как
(k)(n)
.Попробуйте онлайн!
Или 24 байта для поддержки BigInts.
JavaScript (ES6), 55 байт
Принимает ввод в виде строки, используя формат, описанный в задании.
Попробуйте онлайн!
источник
Пробел , 91 байт
Буквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только в качестве объяснения.Попробуйте онлайн (только с необработанными пробелами, вкладками и новыми строками).
Объяснение в псевдокоде:
источник
Python 2 , 29 байт
Попробуйте онлайн!
источник
Perl 6 , 22 байта
Попробуйте онлайн!
Анонимный кодовый блок, который возвращает произведение диапазона, начиная с первого ввода, с уменьшением на второй, пока не станет ниже
1
, за исключением последнего числа. Это работает0
, поскольку базовый случай уменьшения на произведение равен 1, поэтому выходной результат равен 1.источник
05AB1E ,
1087 байтВвод как два отдельных входа: первый вход
base
; вторым входом являетсяfactorial
.Попробуйте онлайн или проверьте все контрольные примеры .
-2 байта благодаря @ Mr.Xcoder .
-1 байт благодаря @JonathanAllan .
Объяснение:
Оригинальный 10- байтовый ответ:
Ввод как два отдельных входа: первый вход
base
; вторым входом являетсяfactorial
.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
LR²ιнP
( Попробуйте онлайн! ) Работает для каждого теста, кроме 0.LR²ιн0KP
для 8 байтов?0K
должно быть ненужным, так как0!
это неверный ввод в спецификации (даже если он включен в примеры) - я прокомментировал это.0!
во входном доменеݦRXιнP
сохраняет байт.машинный код x86-64, 12 байт
Тот же машинный код делает то же самое в 32-битном режиме и для 16-битных целых в 16-битном режиме.
Это функция, вызываемая с арг
n=RCX
,k=ESI
. 32-битное возвращаемое значение вEAX
.Вызывается из C с помощью соглашения о вызовах System V x86-64 с фиктивными аргументами, чтобы получить реальные аргументы в правильные регистры.
uint32_t factk(int, uint32_t k, int, uint64_t n);
Я не мог просто использовать Windows x64, потому что 1-mul
операндный клоббер RDX, и мы не хотим, чтобы префиксы REX имели доступ к R8 / R9.n
не должно быть никакого мусора в старших 32 битах, чтобы JRCXZ работал, но кроме этого он все 32-битный.Список NASM (относительный адрес, машинный код, источник)
0xc = 12 байт
Или 10 байтов, если нам не нужно обрабатывать
n=0
особый случай, исключаяjrcxz
.Для стандартного факториала вы бы использовали
loop
вместо sub / ja, чтобы сохранить 2 байта, но в остальном точно такой же код.Тест вызывающего абонента, который проходит
argc
какk
, сn
жестко закодированным.источник
APL (Dyalog Unicode) , 11 байтов SBCS
Анонимная молчаливая инфиксная функция. Принимает в
n
качестве правого аргумента и вb
качестве левого аргумента.Попробуйте онлайн!
×∘⍳
кратноb
по ɩ ntegers 1 черезn
⊢-
вычесть это изn
⊢,
перед именемn
1⌈
максимум одного и каждого из тех×/
продуктисточник
Рубин , 25 байт
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
2221 байтПопробуйте онлайн!
-1 благодаря attinat:
Times --> 1##&
Объяснение: используйте,
Range
чтобы составить список значений{n, n-k, n-2k, n-3k, ...}
, останавливаясь перед тем, как опуститься ниже 1 (то есть останавливаясь как раз вправо). Затем умножьте все числа в этом списке наTimes
(или1##&
).источник
1##&
вместоTimes
Java 10, 44 байта
Принимает факториал в качестве первого ввода, а базу в качестве второго.
Попробуйте онлайн.
Это выше не работает для самого большого тестового случая из-за ограниченного целочисленного диапазона (32 бита). Чтобы исправить это , мы можем использовать
BigIntegers
, который посовпадениюявляетсяименно двойной размер - 8879 байт :-9 байт благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
Japt , 8 байт
Попытайся
-1 Спасибо EoI за то, что он глупый без кофеина Шегги!
источник
kT
можно заменитьf
на 1 байтC (gcc) , 41 байт
Попробуйте онлайн!
источник
r;f(n,k){for(r=1;n>0;n-=k)r*=n;n=r;}
для C (gcc)MathGolf ,
76 байтовПопробуйте онлайн!
Нашел умный способ справиться с 0! без изменения других тестовых случаев. Принимает ввод как
k n
(обратный порядок), который помогает с неявным появлением.объяснение
источник
Атташе ,
2119 байтПопробуйте онлайн! Довольно прямая рекурсивная реализация. (Примечание:
true
по сути1
, так как его можно использовать в арифметических операциях, как1
.) Это одна из немногих программ, которые я написал для этого сайта, где использование оператора Юникод сохраняет байты (1, если быть точным).альтернативы
20 байтов:
${x<y or x*$[x-y,y]}
21 байт:
Prod@${{_%y=x%y}\1:x}
27 байт:
${x*[`1,$][x>y][x-y,y]∨1}
27 байт:
${If[x>y,x*$[x-y,y],_or 1]}
27 байт:
${x*[`1,$][x>y][x-y,y]or 1}
29 байт:
${If[x>y,x*$[x-y,y],_+not _]}
источник
Ржавчина ,
927361 байтЯ только начинаю изучать ржавчину, поэтому я уверен, что это может быть короче. Буду обновлять по мере того как я учу. Возвращаемое значение должно быть
i128
для того, чтобы вычислить последний тест.Изменить: рекурсия короче.
Попробуйте онлайн!
Вы можете добавить свой собственный тест или отредактировать один из уже существующих.
источник
q ,
59 57 5553 байтаобъяснение:
здесь также есть версия в k (та же логика),
4241 байтисточник
Физика , 22 байта
Попробуйте онлайн!
26 байт
Переучить, как использовать свой собственный «язык» \ o / ... Если бы я знал, как написать парсер 2 года назад, это было бы 20 байтов :(
или
Попробуйте онлайн!
источник
Сетчатка , 66 байт
Попробуйте онлайн! Ссылка включает в себя более быстрые тестовые случаи. Молс номера без восклицательных знаков. Объяснение:
Исправить
0!
.Преобразовать
n
в одинарный и добавить разделитель.Несколько раз вычесть
k
из вn
то времяn>k
, и собрать результаты.Заменить
k
на1
(в десятичном виде).Умножьте на каждое промежуточное значение по очереди, преобразовав в десятичное число.
источник
Japt , 8 байт
Попытайся
источник
JavaScript (Node.js) , 35 байт
Попробуйте онлайн!
источник
Forth (gforth) , 50 байтов
Попробуйте онлайн!
Код Объяснение
источник
Perl 5
-Mbigint -p
, 45 байтПопробуйте онлайн!
источник
Stax , 6 байт
Запустите и отладьте его
Требуется ввод в форме
{count} {base}
.источник
Gaia , 6 байт
Попробуйте онлайн!
Принимает ввод как
n
,k
так что ввод3 4
будет3!!!!
.источник