В математике факториал, сокращенный «факт» неотрицательного целого числа n , обозначается через n! , является произведением всех натуральных чисел, меньших или равных n . Например, 5! это 1 * 2 * 3 * 4 * 5 = 120
Факториал 0 равен 1 , в соответствии с соглашением для пустого продукта.
Это обычные факты, к которым мы привыкли. Давайте добавим несколько альтернатив:
- Факториал (определенный выше)
- Двойной факториал: n !! = 1 + 2 + ... + n
- Тройной факториал: n !!! = 1 - (2 - (3 - (... - n))) ...)
- Четырехкратный факториал: n !!!! = 1 / (2 / (3 ... / n))) ...) . Примечание. Это деление с плавающей запятой, а не целочисленное деление.
Вызов
Возьмем неотрицательный целочисленный ввод n , за которым непосредственно следуют от 1 до 4 восклицательных знаков. Вход будет выглядеть (точно) так: 0! , 5 !! , 132 !!! или 4 !!!! , К сожалению, вы не можете использовать гибкий формат ввода.
Выход
Результат должен быть результатом в любом удобном формате. Результат четырехкратного факториала должен иметь как минимум 2 цифры после десятичной точки, кроме 0 !!!! = 0 .
Тестовые случаи:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
---
0!! = 0
1!! = 1
2!! = 3
3!! = 6
4!! = 10
5!! = 15
6!! = 21
7!! = 28
8!! = 36
9!! = 45
10!! = 55
---
0!!! = 0
1!!! = 1
2!!! = -1
3!!! = 2
4!!! = -2
5!!! = 3
6!!! = -3
7!!! = 4
8!!! = -4
9!!! = 5
10!!! = -5
---
0!!!! = 0
1!!!! = 1
2!!!! = 0.5
3!!!! = 1.5
4!!!! = 0.375
5!!!! = 1.875
6!!!! = 0.3125
7!!!! = 2.1875
8!!!! = 0.27344
9!!!! = 2.4609
10!!!! = 0.24609
Самое короткое решение на каждом языке выигрывает.
0!
->1
.Ответы:
JavaScript (ES6), 88 байт
Контрольные примеры
Показать фрагмент кода
Отформатировано и прокомментировано
источник
Шелуха , 15 байт
Попробуйте онлайн!
объяснение
Индексирование в список функций: радости использования функционального языка.
Я использую нисходящий диапазон и левые сгибы, так как
-
и/
принимаю их аргументы в обратном порядке в Husk.источник
Indexing into a list of functions
это вау ...C # (.NET Core) ,
134 130128 байтовПопробуйте онлайн!
Лучшая часть игры в гольф кода - это то, что вы изучаете, пытаясь решить задачи. В этом я узнал, что в C # вы можете обрезать другие символы, кроме пробелов, из строк.
s.Split('!').Length
, просто установите ограничения вe>4?i/r:e>3?i-r:e>2?i+r:i*r
иn<1&e<3?1:r
.источник
e
n
аi
такжеdouble
не объявлять его для r, чтобы сохранить 4 байта.float
сохранить еще один байт.Perl 5 , 62 байта
61 байт код + 1 для
-p
.Спасибо @GB за указание на промах с моей стороны!
Попробуйте онлайн! (это используется
-l
для удобства чтения)источник
R ,
113111 байтПопробуйте несколько тестовых случаев!
ungolfed:
источник
el(strsplit(s,"!"))
сохраняет 1 байтPython3,
124130121119 байтНа данный момент, я считаю, что рекурсия является ключом к дальнейшей экономии байтов.
Попробуйте тестовые случаи на Попробуйте онлайн!
-9 байт благодаря @ Mr.Xcoder !
-2 байта благодаря @ Филипе Нарди Батиста !
источник
Pyth ,
3430 байтПопробуйте онлайн!
объяснение
источник
.U
сохраняет байт.05AB1E , 27 байт
Попробуйте онлайн!
источник
„.»
ли вы, почему не работает?»
является частью незаконченной сжатой строки, поэтому она выдает ошибку и, как обычно в 05AB1E, ошибка игнорируется."*+-/"èU
после использованияL
продолжения,.»X
но он воспринимаетсяX
как строка, а не как команда, и.»X.V
даже более странно.X
не оценивается .X.V
две команды.Рубин ,
83 8079 байтовПопробуйте онлайн!
Объяснение:
источник
Java 8,
141136134 байта-5 байт (141 → 136) благодаря ответу @CarlosAlejo на C # .
Объяснение:
Попробуй это здесь.
источник
float
корочеdouble
.float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)
к текущему ответу сэкономил мне 5 байтов. :) Забыл добавить часть " Байты спасены благодаря ", которую я заметил сейчас. Извините.Желе ,
24 23 2625 байт+
3исправления 2 байта, чтобы исправить после неправильной интерпретации :(Полная программа (монадическая ссылка со вспомогательными ссылками, на которые ссылается местоположение программы)
Попробуйте онлайн! или увидеть тестов .
Как?
источник
0!
./
. На пустой список D: EDIT: Видимо действительно для0!
,0!!
,0!!!
и0!!!!
+1.Самомодифицирующийся машинный код x86_64, 123 байта
Почему интерпретируемые языки могут динамически запускать код
eval
s, но не простым машинным кодом?Попробуйте это с:
Монтаж:
Пояснения будут добавлены позже. Основная идея заключается в том, чтобы изменить
divss xmm0, xmm1
инструкцию на0x100000db0
и заменить егоmulss
,addss
,subss
или вdivss
соответствии с прилагаемым операндом. Небольшой трюк также используется для анализа входной строки.Сборка генерируется с помощью:
источник
Haskell,
105 102 9896 байтСохранено 9 байтов благодаря Zgarb и Nimi.
Попробуйте онлайн.
источник
read n
, иf=
это не нужно в соответствии с нашими правилами .lex
сохраняет два байта:f s|[(n,b)]<-lex s=read n!(length b-1)
.lex
. Это потрясающе! :) Я не вижу, как это экономит байты, хотя - я получаю 99 байтов после этого.Gaia ,
2625 байтПопробуйте онлайн!
объяснение
источник
Желе , 28 байт
Попробуйте онлайн!
Есть идея разделить ссылки на строки из ответа Джонатана Аллана на -2 байта.
источник
APL (Dyalog) , 30 байтов
Вдохновленный решением Истефано .
Попробуйте онлайн!
{
…}
Анонимная функция, в которой аргумент представлен⍵
:0::
если произойдет какая-либо ошибка:0
вернуть ноль⋄
сейчас попробуй:⍵∩⎕D
пересечение аргумента , а множество D igits (удаляет восклицательные)⍎
выполнить это (превращает его в число)⍳
В конце концов(
…)/
Вставить (при необходимости, APL ассоциативно справа) следующую функцию между терминами:⍵~⎕D
аргумент без D igits (листья восклицательные)≢
подсчитать, что (то есть, сколько восклицательных знаков)'×+-⌹'⊃⍨
используйте это, чтобы выбрать из списка символов *⍎
выполнить (превращает символ в функцию)⌹
(матричное разделение) используется вместо÷
(нормальное разделение), чтобы вызвать ошибку в пустом спискеисточник
::
в DFN?::
случая, то::
сразу же будет возвращено значение справа от .Perl 5 , 96 байт
Попробуйте онлайн!
источник
Dyalog APL, не менее 29 символов
Выражение почти верное. Он проходит все тестовые случаи, КРОМЕ
0!!!!
для которых он дает1
вместо обязательного,0
и это потому, что в APL сокращение пустого вектора должно возвращать нейтральный элемент для функции, используемой для сокращения. Для фактора это 1. На данный момент у меня нет времени, чтобы попытаться это исправить, но я оставлю это здесь на черный день.источник
{0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D}
попробуйте онлайн!05AB1E ,
2524 байтаПопробуйте онлайн!
источник
Mathematica, 152 байта
источник
Javascript,
111163 байтаЧитаемая версия
источник