O desafio é calcular a soma dos dígitos do fatorial de um número.
Exemplo
Input: 10
Output: 27
10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 e a soma dos dígitos no número 10! é 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27
Você pode esperar que a entrada seja um número inteiro acima de 0. A saída pode ser de qualquer tipo, mas a resposta deve estar na base padrão da linguagem de codificação.
Casos de teste:
10 27
19 45
469 4140
985 10053
Nota: alguns idiomas não podem suportar números grandes acima de números inteiros de 32 bits; para esses idiomas, não é esperado que você calcule fatoriais grandes.
Link OEIS aqui, graças a Martin Ender
Isso é código-golfe , então o código mais curto em caracteres vence!
code-golf
math
arithmetic
factorial
George
fonte
fonte
n>21
Respostas:
05AB1E , 3 bytes
Experimente online!
fonte
Gelatina , 3 bytes
Experimente online!
Faz o que você espera:
fonte
Mathematica, 21 bytes
fonte
[#!]
e não@#!
? (Mathematica noob)@
tem maior precedência que!
.C ++ 11, 58 bytes
Como lambda sem nome, modificando sua entrada:
Um dos casos raros em que meu código C ++ é mais curto que o código C .
Se você deseja dar suporte a casos maiores, mude para C ++ 14 e use:
e forneça o argumento de chamada com
ull
sufixo.Uso:
fonte
Ruby,
63615338 bytesNova abordagem graças ao manatwork:
Velho:
fonte
eval
maneira:->n{eval"#{(1..n).reduce:*}".chars*?+}
.Pitão,
76 bytesObrigado a @Kade por me salvar um byte
sj.!QT
Experimente online!
Esta é a minha primeira vez usando Pyth, por isso tenho certeza de que minha resposta pode ser um tanto quanto complicada.
Explicação:
fonte
10
é atribuído a uma variávelT
, de modo que você pode fazer issosj.!QT
:)ssM`.!
faz o trabalho também, também em 6 bytes.Haskell,
4140 bytesExemplo de uso:
f 985
->10053
.Faça uma lista de
1
parax
, calcule o produto dos elementos da lista, transforme-o em sua representação de sequência, transforme cada caractere em um número e some-o.Edit: @Angs salvou um byte. Obrigado!
fonte
f x=sum$read.pure<$>(show$product[1..x])
salva um bytePython, 54 bytes
repl.it
fonte
R,
5853 bytesEdit: Salvo um byte graças a @Jonathan Carroll e alguns graças a @Micky T
Infelizmente, com números inteiros de 32 bits, isso funciona apenas para
n < 22
. Leva a entrada de stdin e as saídas para stdout.Se alguém quiser uma precisão de nível mais alto, precisará usar alguma biblioteca externa, como
Rmpfr
:fonte
c(x,"")
vspaste(x)
:sum(as.integer(el(strsplit(c(factorial(scan()),""),""))))
. Coage o resultado fatorial ao caractere e ostrsplit
retorna como uma segunda lista, portanto,el
ainda funciona e extrai os primeiros elementos da lista.prod(1:scan())
?as.double
deve ser suficientestrtoi
funciona como uma substituição mais curtaas.double
, eu acho.Pip , 8 bytes
Experimente online!
Explicação
fonte
CJam , 8 bytes
Experimente online!
Explicação
fonte
Braquilog , 5 bytes
Experimente online!
Explicação
Basicamente, o algoritmo descrito:
fonte
Java 7, 148 bytes
fonte
Ruby,
63 60 5351 bytesAgradecimentos a Martin pela ajuda no golfe.
fonte
Pushy , 4 bytes
Dar entrada na linha de comando:
$ pushy facsum.pshy 5
. Aqui está o detalhamento:fonte
Oitava, 30 bytes
Calcula o fatorial usando o produto da lista
[1 2 ... n]
. Converte-o em uma string e subtrai48
de todos os elementos (código ASCII para0
). Finalmente, resume-se :)fonte
bash (seq, bc, fold, jq),
3433 bytesCertamente não é o mais elegante, mas o desafio
fonte
fold -1
salva um byte.C, 58 bytes
Isto não é perfeito. Só funciona porque um tem que ser -1 no início. A idéia é usar duas funções recursivas em uma função. Não foi tão fácil como eu pensava.
Uso e formato compreensível:
Edit: Encontrei o método que permite usar essa função várias vezes, mas o comprimento é 62 bytes.
fonte
Perl 6 , 21 bytes
Expandido:
fonte
Cubix,
3332 bytesFormulário líquido:
Experimente online!
Notas
Infinity
número (tecnicamente falando, é uma propriedade não gravável, não enumerável e não configurável do objeto de janela).Explicação
Este programa consiste em dois loops. O primeiro calcula o fatorial da entrada, o outro divide o resultado em seus dígitos e os soma. A soma é impressa e o programa termina.
Começar
Primeiro, precisamos preparar a pilha. Para essa parte, usamos as três primeiras instruções. O IP começa na quarta linha, apontando para o leste. A pilha está vazia.
Manteremos a soma no final da pilha, portanto, precisamos começar
0
sendo a soma armazenando-a no final da pilha. Então precisamos pressionar um1
, porque a entrada será multiplicada inicialmente pelo número antes dela. Se fosse zero, o fatorial sempre produziria zero também. Por fim, lemos a entrada como um número inteiro.Agora, a pilha está
[0, 1, input]
e o IP está na quarta linha, na quarta coluna, apontando para leste.Laço fatorial
Este é um loop simples que multiplica os dois principais elementos da pilha (o resultado do loop anterior e da entrada - n, e depois diminui a entrada. Ele interrompe quando a entrada atinge 0. A
$
instrução faz com que o IP pule au
- O loop é a seguinte parte do cubo: O IP começa na quarta linha, quarta coluna.Por causa do
^
personagem, o IP começa a se mover para o norte imediatamente. Em seguida, eleu
gira o IP e o move um para a direita. Na parte inferior, há outra seta:<
aponta o IP de volta para o^
. A pilha começa como[previousresult, input-n]
, onden
está o número de iterações. Os seguintes caracteres são executados no loop:Em seguida, a parte superior da pilha (entrada reduzida) é comparada
0
pela!
instrução e, se estiver0
, au
caractere é ignorado.Soma os dígitos
O IP envolve o cubo, terminando no último caractere da quarta linha, inicialmente apontando para o oeste. O loop a seguir consiste em praticamente todos os caracteres restantes:
O loop primeiro exclui o item superior da pilha (que é um
10
ou0
) e, em seguida, verifica o que resta do resultado do fatorial. Se isso foi reduzido para0
, a parte inferior da pilha (a soma) é impressa e o programa para. Caso contrário, as seguintes instruções serão executadas (a pilha começa como[oldsum, ..., factorial]
):E o loop começa novamente, até
factorial/10
igual a 0.fonte
C, 47 bytes
uso:
fonte
Python, 57 bytes
Experimente online
fonte
L
vez que o fatorial é grande o suficiente para se tornar um longo.Lote, 112 bytes
Convenientemente
set/a
funciona com o valor atual de uma variável, portanto normalmente funciona dentro de um loop. Funciona apenas até 12 devido às limitações do tipo inteiro do Lote, portanto, em teoria, eu poderia salvar um byte assumindof<1e9
:Mas dessa maneira está a loucura ... Eu também poderia codificar a lista nesse caso (97 bytes):
fonte
JavaScript (ES6), 50 bytes
Funciona apenas
n=22
devido a limitações de precisão de ponto flutuante.fonte
Befunge 93 ,
5654 bytesEconomizou 2 bytes no uso de get em vez de aspas. Isso permite que eu mude as 2 principais linhas sobre 1, reduzindo o espaço em branco desnecessário.
Experimente online!
Explicação:
fonte
Javascript ES6 -
6154 bytesEDIT: Obrigado Hedi e ETHproductions por reduzir 7 bytes. Vou ter que me lembrar desse truque t - = - j.
fonte
n=>{a=_=>!_||_*a(~-_);t=0;for(j of''+a(n))t-=-j;return t}
n=>eval(`for(j of''+(a=_=>!_||_*a(~-_))(n,t=0))t-=-j`)
AHK , 60 bytes
O AutoHotkey não possui uma função fatorial interna e as funções de loop têm nomes longos para suas variáveis internas. O primeiro loop é o fatorial e o segundo é somar os dígitos.
fonte
J,
1211 bytesGuardado 1 byte graças a cole!
Isso simplesmente aplica sum (
1#.
) aos dígitos (usando ainv
conversão inversa da base#.
com uma base de10
) do fatorial (!
) do argumento.Casos de teste
Nota: os dois últimos casos de teste são bigints, conforme marcado por um final
x
.fonte
"."0":
para obter dígitos1#.,.&.":@!
que requer precisão estendida também para casos menores (não sei por que). Também 11 bytes:1#.10#.inv!
.Brachylog (v2), 3 bytes
Experimente online!
O mesmo "algoritmo" da resposta v1 de @Fatalize, apenas com melhor codificação.
fonte
C,
63bytes 60-3 byte para
do...while
loop.Ungolfed e uso:
fonte
int
padrão?int
é assumido.