Em matemática, o fatorial, encurtou o "fato" de um número inteiro não negativo n , denotado por n! , é o produto de todos os números inteiros positivos menores ou iguais a n . Por exemplo, 5! é 1 * 2 * 3 * 4 * 5 = 120
O fatorial de 0 é 1 , de acordo com a convenção para um produto vazio.
Esses são os fatos regulares a que estamos acostumados. Vamos adicionar algumas alternativas:
- O fatorial (definido acima)
- O fatorial duplo: n !! = 1 + 2 + ... + n
- O fatorial triplo: n !!! = 1 - (2 - (3 - (... - n))) ...)
- O fator quádruplo: n !!!! = 1 / (2 / (3 ... / n))) ...) . Nota: Esta é a divisão de ponto flutuante, não a divisão inteira.
Desafio
Tomar uma entrada de número inteiro não negativo n , directamente seguido por entre 1 e 4 exclamação marcas. A entrada será (exatamente) assim: 0! , 5 !! , 132 !!! ou 4 !!!! . Neste desafio, você não pode assumir um formato de entrada flexível, desculpe.
Resultado
A saída deve ser o resultado, em qualquer formato conveniente. O resultado do fatorial quádruplo deve ter pelo menos 2 dígitos após o ponto decimal, exceto 0 !!!! = 0 .
Casos de teste:
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
A solução mais curta em cada idioma vence.
0!
->1
.Respostas:
JavaScript (ES6), 88 bytes
Casos de teste
Mostrar snippet de código
Formatado e comentado
fonte
Casca , 15 bytes
Experimente online!
Explicação
Indexando em uma lista de funções: as alegrias de usar uma linguagem funcional.
Eu uso um intervalo descendente e dobras à esquerda, desde
-
e/
tomo seus argumentos em ordem inversa no Husk.fonte
Indexing into a list of functions
é woah ...C # (.NET Core) ,
134 130128 bytesExperimente online!
A melhor parte do código de golfe são as coisas que você aprende ao tentar resolver os desafios. Neste, aprendi que, em C #, você pode aparar outros caracteres além dos espaços em branco das strings.
s.Split('!').Length
, basta fixar os limites eme>4?i/r:e>3?i-r:e>2?i+r:i*r
en<1&e<3?1:r
.fonte
e
n
ei
tambémdouble
evitar declará-lo para r salvar 4 bytes.float
para salvar outro byte.Perl 5 , 62 bytes
Código de 61 bytes + 1 para
-p
.Obrigado à @GB por apontar uma falta da minha parte!
Experimente online! (isso usa
-l
para facilitar a leitura)fonte
R ,
113111 bytesExperimente alguns casos de teste!
ungolfed:
fonte
el(strsplit(s,"!"))
salva 1 bytePython3,
124130121119 bytesNeste ponto, acredito que a recursão é a chave para economizar ainda mais bytes.
Experimente os casos de teste em Experimente online!
-9 bytes graças a @ Mr.Xcoder !
-2 bytes graças a @Felipe Nardi Batista !
fonte
Pitão ,
3430 bytesExperimente online!
Explicação
fonte
.U
salva um byte.05AB1E , 27 bytes
Experimente online!
fonte
„.»
que não funciona?»
faz parte de uma sequência compactada inacabada; portanto, ocorre um erro e, como geralmente em 05AB1E, o erro é ignorado."*+-/"èU
isso depois de usar oL
acompanhamento,.»X
mas ele trataX
como uma sequência, não como um comando e.»X.V
é ainda mais complicado.X
não avalia .X.V
são dois comandos.Ruby ,
83 8079 bytesExperimente online!
Explicação:
fonte
Java 8,
141136134 bytes-5 bytes (141 → 136) graças a @CarlosAlejo C # de .
Explicação:
Experimente aqui.
fonte
float
é mais curto quedouble
.float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)
para a resposta atual me salvou em 5 bytes. :) Esqueci de adicionar uma parte " bytes salvos graças a " notei agora .. Desculpe por isso.Jelly ,
24 23 2625 bytes+
32 bytes corrigidos para correção após má interpretação :(Um programa completo (um link monádico com links auxiliares referenciados pelo local do programa)
Experimente online! ou veja uma suíte de testes .
Quão?
fonte
0!
./
. Em uma lista vazia D: EDIT: Aparentemente válida para0!
,0!!
,0!!!
e0!!!!
+1.Código de máquina x86_64 auto-modificável, 123 bytes
Por que linguagens interpretadas seriam capazes de executar código dinamicamente com
eval
s sofisticados , mas não com código de máquina simples?Experimente com:
Montagem:
As explicações serão adicionadas mais tarde. A idéia básica é a de modificar a
divss xmm0, xmm1
instrução em0x100000db0
e substituí-lo com ummulss
,addss
,subss
oudivss
de acordo com o operando fornecido. Um pequeno truque também é usado para analisar a sequência de entrada.Montagem gerada com:
fonte
Haskell,
105 102 9896 bytesEconomizou 9 bytes graças ao Zgarb e nimi.
Experimente online.
fonte
read n
ef=
é desnecessário de acordo com nossas regras .lex
salva dois bytes:f s|[(n,b)]<-lex s=read n!(length b-1)
.lex
. Fantástico! :) Mas não vejo como isso salva bytes - recebo 99 bytes depois disso.Gaia ,
2625 bytesExperimente online!
Explicação
fonte
Gelatina , 28 bytes
Experimente online!
Tive a idéia de separar os links em linhas da resposta de Jonathan Allan para -2 bytes.
fonte
APL (Dyalog) , 30 bytes
Inspirado na solução da lstefano .
Experimente online!
{
…}
Função anônima em que o argumento é representado por⍵
:0::
se ocorrer algum erro:0
retornar zero⋄
agora tente:⍵∩⎕D
a interseção do argumento e o conjunto de D igits (remove pontos de exclamação)⍎
execute isso (transforma em número)⍳
índices disso(
…)/
Insira (APL é associativo corretamente, conforme necessário) a seguinte função entre termos:⍵~⎕D
argumento sem D igits (deixa pontos de exclamação)≢
registro que (ou seja, quantos pontos de exclamação)'×+-⌹'⊃⍨
use isso para escolher na lista de símbolos *⍎
execute (transforma o símbolo em uma função)⌹
(divisão da matriz) é usada em vez de÷
(divisão normal) para causar um erro em uma lista vaziafonte
::
faz em um dfn?::
ocorrerá um erro com qualquer um dos números (0 = 1 a 999, 1000 = 1001 ...) à esquerda do resultado , e o valor à direita da::
é retornado imediatamente.Perl 5 , 96 bytes
Experimente online!
fonte
Dyalog APL, pelo menos 29 caracteres
A expressão está QUASE correta. Ele passa em todos os casos de teste, EXCETO
0!!!!
para os quais é fornecido, em1
vez do necessário,0
e isso ocorre porque na APL a redução de um vetor vazio deve retornar o elemento neutro para a função usada para reduzir. Para o quociente que é 1. No momento, não tenho tempo para tentar consertá-lo, mas deixarei aqui por um dia chuvoso.fonte
{0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D}
Experimente online!05AB1E ,
2524 bytesExperimente online!
fonte
Mathematica, 152 bytes
fonte
Javascript,
111163 bytesVersão legível
fonte