Não confunda com Encontre o fatorial!
Introdução
O fatorial de um número inteiro n
pode ser calculado por
Isso é relativamente fácil e nada de novo. No entanto, os fatoriais podem ser estendidos para fatoriais duplos , de modo que
Em resumo:
O desafio
Escreva uma função que calcule qualquer tipo de fatorial repetido para qualquer número inteiro não negativo.
Entrada
Ou
- Uma sequência contendo um número inteiro de base dez não negativo, seguido por 1 ou mais pontos de exclamação. Por exemplo,
"6!"
ou"9!!"
ou"40!!!!!!!!!!!!!!!!!!!!"
.
ou
- Os mesmos valores representados por dois números inteiros: um valor base não negativo e um valor positivo representando a contagem fatorial. Isso pode ser feito de acordo com qualquer formato das regras de E / S padrão.
Saída
O resultado do referido cálculo.
Comentários do desafio
0!
é igual1
por definição. Seu código deve ser responsável por isso.- A contagem factorial é limitado por fora desta faixa, você está livre para a saída de qualquer outra coisa. Além de
0!
, que é a única exceção a esta regra.
Exemplos
Input Output
3!!! 3
0! 1
6! 720
9!! 945
10!!!!!!!! 20
40!!!!!!!!!!!!!!!!!!!! 800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41697106428257280000000000000000
Experimente com uma implementação Python não destruída: Experimente online!
Observações gerais
- Isso é código-golfe , então a resposta usando o menor número de bytes em cada idioma vence.
- Regras padrão , regras de E / S e regras de brecha são aplicadas.
- Inclua um link Experimente online para demonstrar seu funcionamento do código.
- Motive sua resposta com uma explicação do seu código.
0!
mas as observações do desafio dizem que a contagem fatorial será menor ou igual ao valor base.3!!!!!!!
não deve ser indefinido - deve apenas dar a resposta3
. É o mesmo que1!!=1
(não indefinido). Além disso, sua especificação de entrada diz que sempre haverá pelo menos uma!
, portanto o primeiro exemplo3
não se ajusta à especificação.(3!)!
a remoção de termos de um fatorial. É um nome enganador; Eu assumi que ele aplicaria a função fatorial repetidamente em uma cadeia e tive que ler atentamente para ver o que realmente era. Felizmente, a pergunta explica claramente. Um nome melhor pode ser fatorial de passo ou fatorial de etapa ou algo assim.Respostas:
R , 33 bytes
Experimente online!
Manipulan=0 adicionando a negação lógica de n .
fonte
ArnoldC ,
702 698634 bytesExperimente online!
Traduzido para pseudocódigo:
Nota: ArnoldC possui apenas um tipo de dados: número inteiro assinado de 16 bits. Portanto, não posso testar o
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caso.fonte
c
variável realmente armazena o valor da comparação entren
e0
.Gelatina , 4 bytes
Experimente online!
Quão? Dadon e k , ele primeiro gera o intervalo n , ⋯ , 1 (com kº elemento desse intervalo (então n , n - k , n - 2 k , ⋯ , n - ⌊ n / k ⌋ k ) e, finalmente, multiplica-os usando
RṚ
) e, em seguidam
, mantém cadaP
.fonte
RṚ
m
P
. Just the straightforward approach. Edit: I added this explanation in the answer.r1mP
.APL (Dyalog Extended), 7 bytesSBCS
Anonymous tacit prefix function. Takes
[n,b]
as argument.Try it online!
1¨
one for each element of the argument;[1,1]
-\
cumulative difference;[n,n-b]
…
range using second element of left argument as indicator of step, e.g.[9,7]
continues with5
×/
productfonte
Haskell, 21 bytes
Try it online!
Combinar a função interna do produto com a enumeração de intervalos escalonados supera o que eu poderia codificar recursivamente (mesmo com falhas ao salvar um byte).
22 bytes
Experimente online!
Aqui está uma solução que aceita dados no formato string
9!!
, que eu acho mais interessante.42 bytes
Experimente online!
fonte
n%a|n<1=1|m<-n-a=n*m%a
Pitão , 6 bytes
Estes são todos equivalentes a 6 bytes:
Experimente online! (
*F:Q1E
)Ou 11 bytes , recebendo a entrada como uma sequência:
Suíte de teste.
fonte
JavaScript (ES6), 21 bytes
Toma entrada como
(k)(n)
.Experimente online!
Ou 24 bytes para oferecer suporte a BigInts.
JavaScript (ES6), 55 bytes
Recebe a entrada como uma sequência, usando o formato descrito no desafio.
Experimente online!
fonte
Espaço em branco , 91 bytes
Letras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Experimente online (apenas com espaços brutos, guias e novas linhas).
Explicação em pseudo-código:
fonte
Python 2 , 29 bytes
Experimente online!
fonte
Perl 6 , 22 bytes
Experimente online!
Codeblock anônimo que retorna o produto do intervalo começando na primeira entrada, diminuindo a cada segundo até ficar abaixo
1
, excluindo o último número. Isso funciona porque0
, como o caso base de uma redução por produto é 1, a saída é 1.fonte
05AB1E ,
1087 bytesEntrada como duas entradas separadas: sendo a primeira entrada
base
; segunda entrada sendofactorial
.Experimente online ou verifique todos os casos de teste .
-2 bytes graças a @ Mr.Xcoder .
-1 byte graças a @ JonathanAllan .
Explicação:
Resposta original de 10 bytes :
Entrada como duas entradas separadas: sendo a primeira entrada
base
; segunda entrada sendofactorial
.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
LR²ιнP
( Experimente on-line! ) Funciona para todos os casos de teste, exceto para 0.LR²ιн0KP
por 8 bytes?0K
deve ser desnecessário, pois0!
é uma entrada inválida pela especificação (mesmo que tenha sido incluída nos exemplos) - eu comentei sobre isso.0!
estiver no domínio de entrada,ݦRXιнP
salva um byte.código de máquina x86-64, 12 bytes
O mesmo código de máquina faz a mesma coisa no modo de 32 bits e para números inteiros de 16 bits no modo de 16 bits.
Esta é uma função, que pode ser chamado com argumentos
n=RCX
,k=ESI
. Valor de retorno de 32 bits emEAX
.É possível chamar de C com a convenção de chamada do System V x86-64 com argumentos fictícios para obter os argumentos reais nos registros corretos.
uint32_t factk(int, uint32_t k, int, uint64_t n);
Eu não podia simplesmente usar o Windows x64 porque um operandomul
bloqueia o RDX e não queremos que os prefixos REX acessem o R8 / R9.n
não deve ter nenhum lixo nos 32 bits altos, para que o JRCXZ funcione, mas, além disso, é tudo de 32 bits.Listagem NASM (endereço relativo, código da máquina, origem)
0xc = 12 bytes
Ou 10 bytes, se não precisássemos lidar com o
n=0
caso especial, deixando de fora ojrcxz
.Para fatorial padrão, você usaria em
loop
vez de sub / ja para economizar 2 bytes, mas, caso contrário, o mesmo código.Chamador teste que passa
argc
comok
, comn
codificados.fonte
APL (Dyalog Unicode) , 11 bytes SBCS
Função de infixo tácito anônimo. Toma
n
como argumento certo eb
como argumento esquerdo.Experimente online!
×∘⍳
multiplicarb
pelas Ɩ ntegers 1 atravésn
⊢-
subtrair isso den
⊢,
precedern
1⌈
máximo de um e cada um deles×/
produtosfonte
Ruby , 25 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) ,
2221 bytesExperimente online!
-1 graças a attinat:
Times --> 1##&
Explicação: use
Range
para fazer uma lista dos valores{n, n-k, n-2k, n-3k, ...}
, parando antes de ficar abaixo de 1 (ou seja, parando exatamente à direita). Multiplique todos os números nesta lista comTimes
(ou1##&
).fonte
1##&
vez deTimes
Java 10, 44 bytes
Toma o fatorial como primeira entrada, base como segundo.
Experimente online.
Isso acima não funciona para o maior caso de teste devido ao intervalo inteiro limitado (32 bits). Para corrigir isso, podemos usar
BigIntegers
, quecoincidentementeéexatamente o dobro do tamanho - 8879 bytes :-9 bytes graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
Japonês , 8 bytes
Tente
-1 graças a EoI, apontando o quão desgrenhado e descafeinado Shaggy pode ser!
fonte
kT
pode ser substituídof
por 1 byteC (gcc) , 41 bytes
Experimente online!
fonte
r;f(n,k){for(r=1;n>0;n-=k)r*=n;n=r;}
para C (gcc)MathGolf ,
76 bytesExperimente online!
Encontrei uma maneira inteligente de lidar com 0! sem alterar os outros casos de teste. Recebe a entrada como
k n
(ordem inversa), o que ajuda no pop-up implícito.Explicação
fonte
Anexo ,
2119 bytesExperimente online! Implementação recursiva bastante direta. (Nota:
true
é essencialmente1
, pois pode ser usado em operações aritméticas como1
.) Este é um dos poucos programas que escrevi para este site em que o uso de um operador unicode salva bytes (1, para ser mais preciso).Alternativas
20 bytes:
${x<y or x*$[x-y,y]}
21 bytes:
Prod@${{_%y=x%y}\1:x}
27 bytes:
${x*[`1,$][x>y][x-y,y]∨1}
27 bytes:
${If[x>y,x*$[x-y,y],_or 1]}
27 bytes:
${x*[`1,$][x>y][x-y,y]or 1}
29 bytes:
${If[x>y,x*$[x-y,y],_+not _]}
fonte
Ferrugem ,
927361 bytesEstou apenas começando a aprender ferrugem, então tenho certeza de que isso pode ser mais curto. Será atualizado conforme eu aprender. O valor de retorno deve ser
i128
em ordem para calcular o último teste.Editar: a recursão é mais curta.
Experimente online!
Você pode adicionar seu próprio teste ou editar um dos já existentes.
fonte
q ,
59 57 5553 bytesexplicação:
aqui também está uma versão em k (mesma lógica),
4241 bytesfonte
Physica , 22 bytes
Experimente online!
26 bytes
Re-aprendendo a usar minha própria "linguagem" \ o / ... Se eu soubesse escrever um analisador há 2 anos, isso teria sido 20 bytes :(
ou
Experimente online!
fonte
Retina , 66 bytes
Experimente online! O link inclui casos de teste mais rápidos. Números mauls sem pontos de exclamação. Explicação:
Conserte
0!
.Converta
n
em unário e adicione um separador.Subtraia repetidamente
k
den
enquanton>k
e colete os resultados.Substitua
k
por1
(em decimal).Multiplique por cada valor intermediário, por sua vez, convertendo para decimal.
fonte
Japonês , 8 bytes
Tente
fonte
JavaScript (Node.js) , 35 bytes
Experimente online!
fonte
Quarto (gforth) , 50 bytes
Experimente online!
Código Explicação
fonte
Perl 5
-Mbigint -p
, 45 bytesExperimente online!
fonte
Stax , 6 bytes
Execute e depure
É preciso entrada no formulário
{count} {base}
.fonte
Gaia , 6 bytes
Experimente online!
Toma entrada como
n
,k
, a fim de entrada de3 4
seria3!!!!
.fonte