El desafío es calcular la suma de dígitos del factorial de un número.
Ejemplo
Input: 10
Output: 27
10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, y la suma de los dígitos en el número 10! es 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27
Puede esperar que la entrada sea un número entero superior a 0. La salida puede ser de cualquier tipo, pero la respuesta debe estar en la base estándar del lenguaje de codificación.
Casos de prueba:
10 27
19 45
469 4140
985 10053
Nota: algunos idiomas no pueden admitir grandes números por encima de enteros de 32 bits; para esos idiomas no se espera que calcule factoriales grandes.
Enlace OEIS aquí gracias a Martin Ender
Este es el código de golf , por lo que gana el código más corto en caracteres.
code-golf
math
arithmetic
factorial
Jorge
fuente
fuente
n>21
Respuestas:
05AB1E , 3 bytes
Pruébalo en línea!
fuente
Jalea , 3 bytes
Pruébalo en línea!
Hace lo que esperas:
fuente
Mathematica, 21 bytes
fuente
[#!]
y no@#!
? (Mathematica noob)@
tiene mayor prioridad que!
.C ++ 11, 58 bytes
Como lambda sin nombre modificando su entrada:
Uno de los raros casos en que mi código C ++ es más corto que el código C .
Si desea admitir casos más grandes, cambie a C ++ 14 y use:
y proporcione el argumento de llamada con
ull
sufijo.Uso:
fuente
Ruby,
63615338 bytesNuevo enfoque gracias a manatwork:
Antiguo:
fuente
eval
manera:->n{eval"#{(1..n).reduce:*}".chars*?+}
.Pyth,
76 bytesGracias a @Kade por salvarme un byte
sj.!QT
Pruébalo en línea!
Esta es la primera vez que uso Pyth, así que estoy seguro de que mi respuesta podría ser bastante útil.
Explicación:
fuente
10
está asignado a una variableT
, por lo que puede hacer estosj.!QT
:)ssM`.!
también hace el trabajo, también en 6 bytes.Haskell,
4140 bytesEjemplo de uso:
f 985
->10053
.Haga una lista de
1
ax
, calcule el producto de los elementos de la lista, conviértalo en su representación de cadena, convierta cada carácter en un número y sume.Editar: @Angs guardó un byte. ¡Gracias!
fuente
f x=sum$read.pure<$>(show$product[1..x])
ahorra un bytePython, 54 bytes
repl.it
fuente
R,
5853 bytesEditar: guardado un byte gracias a @Jonathan Carroll y un par de gracias a @Micky T
Desafortunadamente, con enteros de 32 bits, esto solo funciona
n < 22
. Toma entradas de stdin y salidas a stdout.Si a uno le gustaría una precisión de nivel superior, tendría que usar alguna biblioteca externa como
Rmpfr
:fuente
c(x,"")
contrapaste(x)
:sum(as.integer(el(strsplit(c(factorial(scan()),""),""))))
. Obliga el resultado factorial al carácter y lostrsplit
devuelve como una segunda lista, por lo queel
aún funciona y extrae los primeros elementos de la lista.prod(1:scan())
?as.double
debería ser suficientestrtoi
funciona como un reemplazo más cortoas.double
, creo.Pip , 8 bytes
Pruébalo en línea!
Explicación
fuente
CJam , 8 bytes
Pruébalo en línea!
Explicación
fuente
Brachylog , 5 bytes
Pruébalo en línea!
Explicación
Básicamente el algoritmo descrito:
fuente
Java 7, 148 bytes
fuente
Ruby,
63 60 5351 bytesGracias a Martin por la ayuda en el golf.
fuente
Pushy , 4 bytes
Dar entrada en la línea de comandos:
$ pushy facsum.pshy 5
. Aquí está el desglose:fuente
Octava, 30 bytes
Calcula el factorial tomando el producto de la lista
[1 2 ... n]
. Lo convierte en una cadena y lo resta48
de todos los elementos (código ASCII para0
). Finalmente lo resume :)fuente
bash (seq, bc, fold, jq),
3433 bytesSeguramente no sea el más elegante pero para el desafío
fuente
fold -1
guarda un byte.C, 58 bytes
Esto no es perfecto Solo funciona porque tiene que ser -1 en el inicio. La idea es usar dos funciones recursivas en una función. No fue tan fácil como pensé al principio.
Uso y formato comprensible:
Editar: Encontré un método que permite usar esta función varias veces, pero luego la longitud es de 62 bytes.
fuente
Perl 6 , 21 bytes
Expandido:
fuente
Cubix,
3332 bytesForma neta:
Pruébalo en línea!
Notas
Infinity
número (técnicamente hablando, es una propiedad no escribible, no enumerable y no configurable del objeto de ventana).Explicación
Este programa consta de dos bucles. El primero calcula el factorial de la entrada, el otro divide el resultado en sus dígitos y los suma. Luego se imprime la suma y finaliza el programa.
comienzo
Primero, necesitamos preparar la pila. Para esa parte, usamos las primeras tres instrucciones. La IP comienza en la cuarta línea, apuntando hacia el este. La pila está vacía.
Mantendremos la suma en la parte inferior de la pila, por lo que debemos comenzar
0
siendo la suma almacenando eso en la parte inferior de la pila. Luego, debemos presionar a1
, porque la entrada se multiplicará inicialmente por el número anterior. Si esto fuera cero, el factorial siempre daría cero también. Por último, leemos la entrada como un entero.Ahora, la pila está
[0, 1, input]
y la IP está en la cuarta línea, la cuarta columna, apuntando hacia el este.Bucle factorial
Este es un bucle simple que multiplica los dos elementos superiores de la pila (el resultado del bucle anterior y la entrada - n, y luego disminuye la entrada. Se rompe cuando la entrada llega a 0. La
$
instrucción hace que la IP omita elu
- gire. El bucle es la siguiente parte del cubo. La IP comienza en la cuarta línea, cuarta columna.Debido al
^
carácter, la IP comienza a moverse hacia el norte de inmediato. Luego,u
gira la IP y la mueve una hacia la derecha. En la parte inferior, hay otra flecha:<
apunta la IP de nuevo al^
. La pila comienza como[previousresult, input-n]
, donden
es el número de iteraciones. Los siguientes caracteres se ejecutan en el bucle:Luego, la parte superior de la pila (entrada disminuida) se compara
0
con la!
instrucción, y si es así0
,u
se omite el carácter.Suma los dígitos
La IP se envuelve alrededor del cubo, terminando en el último carácter en la cuarta línea, inicialmente apuntando hacia el oeste. El siguiente bucle consta de prácticamente todos los caracteres restantes:
El ciclo primero elimina el elemento superior de la pila (que es
10
o0
) y luego comprueba lo que queda del resultado del factorial. Si eso se ha reducido a0
, se imprime la parte inferior de la pila (la suma) y el programa se detiene. De lo contrario, se ejecutan las siguientes instrucciones (la pila comienza como[oldsum, ..., factorial]
):Y el ciclo comienza de nuevo, hasta que sea
factorial/10
igual a 0.fuente
C, 47 bytes
uso:
fuente
Python, 57 bytes
Pruébalo en línea
fuente
L
vez que el factorial sea lo suficientemente grande como para ser largo.Lote, 112 bytes
set/a
Funciona convenientemente en el valor actual de una variable, por lo que funciona normalmente dentro de un bucle. Solo funciona hasta 12 debido a las limitaciones del tipo entero de Batch, por lo que en teoría podría guardar un byte suponiendof<1e9
:Pero de esa manera se encuentra la locura ... También podría codificar la lista en ese caso (97 bytes):
fuente
JavaScript (ES6), 50 bytes
Solo funciona
n=22
debido a limitaciones de precisión de punto flotante.fuente
Befunge 93 ,
5654 bytesSe guardaron 2 bytes para usar get en lugar de comillas. Esto me permite cambiar las 2 líneas superiores sobre 1, lo que reduce el espacio en blanco innecesario.
Pruébalo en línea!
Explicación:
fuente
Javascript ES6 -
6154 BytesEDITAR: Gracias a Hedi y ETHproductions por reducir 7 bytes. Tendré que recordar que t - = - j truco.
fuente
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
AutoHotkey no tiene una función factorial incorporada y las funciones de bucle tienen nombres largos para sus variables incorporadas. El primer bucle es el factorial y el segundo es sumar los dígitos.
fuente
J,
1211 bytesGuardado 1 byte gracias a cole!
Esto simplemente aplica sum (
1#.
) a los dígitos (usando inversainv
conversión de base#.
con una base de10
) del factorial (!
) del argumento.Casos de prueba
Nota: los dos últimos casos de prueba son bigints, marcados con un final
x
.fuente
"."0":
para obtener dígitos1#.,.&.":@!
que también requiere precisión extendida para casos más pequeños (no estoy seguro de por qué). También 11 bytes:1#.10#.inv!
.Brachylog (v2), 3 bytes
Pruébalo en línea!
El mismo "algoritmo" que la respuesta v1 de @Fatalize, solo que con mejor codificación.
fuente
C,
6360 bytes-3 byte para
do...while
bucle.Sin golf y uso:
fuente
int
por defecto?int
se supone.