¡No debe confundirse con Find the factorial!
Introducción
El factorial de un entero nse puede calcular por
Esto es relativamente fácil y nada nuevo. Sin embargo, los factoriales se pueden extender a factores dobles , de modo que
 
para números pares, y 
 
para números impares. Pero no estamos limitados a factoriales dobles. Por ejemplo
 
o
 
or
 
dependiendo de valor inicial
En resumen:
 
donde
 
O, en inglés simple: reste el conteo factorial del número base repetidamente y multiplique todos los enteros positivos resultantes.
El reto
Escriba una función que calcule cualquier tipo de factorial repetido para cualquier número entero no negativo.
Entrada
Ya sea
- Una cadena que contiene un entero de base diez no negativo, seguido de 1 o más signos de exclamación. Por ejemplo, "6!"or"9!!"o"40!!!!!!!!!!!!!!!!!!!!".
o
- Los mismos valores representados por dos enteros: un valor base no negativo y un valor positivo que representa el recuento factorial. Esto se puede hacer de acuerdo con cualquier formato de las reglas de E / S predeterminadas.
Salida
El resultado de dicho cálculo.
Observaciones de desafío
- 0!igual- 1por definición. Su código debe dar cuenta de esto.
- El conteo factorial está limitado por fuera de este rango, usted es libre de generar lo que sea. Aparte de , que es la única excepción a esta regla.0!
Ejemplos
Input                              Output
3!!!                               3
0!                                 1
6!                                 720
9!!                                945
10!!!!!!!!                         20
40!!!!!!!!!!!!!!!!!!!!             800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  41697106428257280000000000000000
Pruébelo con una implementación de Python sin golf: ¡ Pruébelo en línea!
Observaciones generales
- Este es el código de golf , por lo que gana la respuesta con la menor cantidad de bytes en cada idioma.
- Se aplican reglas estándar , reglas de E / S y reglas de escapatoria .
- Incluya un enlace Probar en línea para demostrar que su código funciona.
- Motive su respuesta con una explicación de su código.

0!pero las observaciones del desafío dicen que el recuento factorial será menor o igual que el valor base.3!!!!!!!no debe estar indefinido, solo debe dar la respuesta3. Es lo mismo que1!!=1(no indefinido). Además, su especificación de entrada dice que siempre habrá al menos uno!, por lo que el primer ejemplo3no se ajusta a la especificación.(3!)!cambio, no está eliminando términos de un factorial. Es un nombre engañoso; Entré suponiendo que iba a aplicar la función Factorial repetidamente en una cadena y tuve que leer cuidadosamente para ver qué era realmente. Afortunadamente, la pregunta lo explica claramente. Un nombre mejor podría ser factorial de paso o factorial de paso o algo así.Respuestas:
R , 33 bytes
Pruébalo en línea!
Maneja agregando la negación lógica de .n=0 n 
fuente
ArnoldC ,
702 698634 bytesPruébalo en línea!
Traducido al pseudocódigo:
Nota: ArnoldC tiene solo un tipo de datos: entero con signo de 16 bits. Por lo tanto, no puedo probar el
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!caso.fuente
cvariable realmente almacena el valor de la comparación entreny0.Jalea , 4 bytes
Pruébalo en línea!
¿Cómo? Dado y , primero genera el rango (con ), luego con él mantiene todos los elementos de este rango (entonces ), y finalmente los multiplica usando .n k n,⋯,1 k th n , n - k , n - 2 k , ⋯ , n - ⌊ n / k ⌋ kkth n,n−k,n−2k,⋯,n−⌊n/k⌋k 
RṚmPfuente
RṚmPr1mP.APL (Dyalog Extended) , SBCS de 7 bytes
Función de prefijo tácito anónimo. Toma
[n,b]como argumento.Pruébalo en línea!
1¨uno para cada elemento del argumento;[1,1]-\diferencia acumulativa;[n,n-b]…rango usando el segundo elemento del argumento izquierdo como indicador del paso, por ejemplo,[9,7]continúa con5×/productofuente
Haskell , 21 bytes
Pruébalo en línea!
La combinación de la función de producto incorporada con la enumeración de rango escalonada supera lo que podría codificar de forma recursiva (incluso con un error al guardar un byte).
22 bytes
Pruébalo en línea!
Aquí hay una solución que toma la entrada en formato de cadena como
9!!, que creo que es más interesante.42 bytes
Pruébalo en línea!
fuente
n%a|n<1=1|m<-n-a=n*m%aPyth , 6 bytes
Todos estos son equivalentes de 6 bytes:
Pruébalo en línea! (
*F:Q1E)O, 11 bytes , tomando la entrada como una cadena:
Banco de pruebas.
fuente
JavaScript (ES6), 21 bytes
Toma entrada como
(k)(n).Pruébalo en línea!
O 24 bytes para admitir BigInts.
JavaScript (ES6), 55 bytes
Toma la entrada como una cadena, utilizando el formato descrito en el desafío.
Pruébalo en línea!
fuente
Espacio en blanco , 91 bytes
Se agregaron letras
S(espacio),T(tabulación) yN(nueva línea) solo como resaltado.[..._some_action]agregado solo como explicación.Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).
Explicación en pseudocódigo:
fuente
Python 2 , 29 bytes
Pruébalo en línea!
fuente
Perl 6 , 22 bytes
Pruébalo en línea!
Codeblock anónimo que devuelve el producto del rango a partir de la primera entrada, disminuyendo en el segundo hasta que esté por debajo
1, excluyendo el último número. Esto funciona para0, ya que el caso base de una reducción por producto es 1, por lo que la salida es 1.fuente
05AB1E ,
1087 bytesEntrada como dos entradas separadas: la primera entrada es
base; segunda entrada siendofactorial.Pruébelo en línea o verifique todos los casos de prueba .
-2 bytes gracias a @ Mr.Xcoder .
-1 byte gracias a @JonathanAllan .
Explicación:
Respuesta original de 10 bytes :
Entrada como dos entradas separadas: la primera entrada es
base; segunda entrada siendofactorial.Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
LR²ιнP(¡ Pruébelo en línea! ) Funciona para todos los casos de prueba, excepto para 0.LR²ιн0KPpara 8 bytes?0Kdebería ser innecesario ya que0!es una entrada no válida por la especificación (a pesar de que se ha incluido en los ejemplos) - He comentado sobre esto.0!está en el dominio de entradaݦRXιнPguarda un byte.Código de máquina x86-64, 12 bytes
El mismo código de máquina hace lo mismo en modo de 32 bits, y para enteros de 16 bits en modo de 16 bits.
Se trata de una función, se puede llamar con argumentos
n=RCX,k=ESI. Valor de retorno de 32 bits enEAX.Se puede llamar desde C con la convención de llamadas del sistema V x86-64 con argumentos falsos para obtener los argumentos reales en los registros correctos.
uint32_t factk(int, uint32_t k, int, uint64_t n);No podría simplemente usar Windows x64 porque losmulclobbers de 1 operando son RDX, y no queremos que los prefijos REX accedan a R8 / R9.nno debe tener basura en los 32 bits altos para que JRCXZ funcione, pero aparte de eso, todo es de 32 bits.Listado NASM (dirección relativa, código de máquina, fuente)
0xc = 12 bytes
O 10 bytes si no necesitábamos manejar el
n=0caso especial, dejando de lado eljrcxz.Para el factorial estándar, usaría en
looplugar de sub / ja para guardar 2 bytes, pero por lo demás exactamente el mismo código.Llamada de prueba que pasa
argccomok, conncodificación fija.fuente
APL (Dyalog Unicode) , SBCS de 11 bytes
Función de infijo tácito anónimo. Toma
ncomo argumento correcto ybcomo argumento izquierdo.Pruébalo en línea!
×∘⍳se multiplicanbpor los Ɩ ntegers 1 a travésn⊢-restar eso den⊢,anteponern1⌈máximo de uno y cada uno de esos×/productofuente
Rubí , 25 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
2221 bytesPruébalo en línea!
-1 gracias a attinat:
Times --> 1##&Explicación: se usa
Rangepara hacer una lista de los valores{n, n-k, n-2k, n-3k, ...}, deteniéndose antes de ir por debajo de 1 (es decir, deteniéndose justo). Luego, multiplique todos los números en esta lista conTimes(o1##&).fuente
1##&lugar deTimesJava 10, 44 bytes
Toma el factorial como primera entrada, la base como segunda.
Pruébalo en línea.
Esto anterior no funciona para el caso de prueba más grande debido al rango entero limitado (32 bits). Para solucionar esto podemos usar
BigIntegers, quecasualmenteesexactamente el doble del tamaño - 8879 bytes :-9 bytes gracias a @ OlivierGrégoire .
Pruébalo en línea.
Explicación:
fuente
Japt , 8 bytes
Intentalo
-1 gracias a EoI que señala cuán tonto y descafeinado puede ser Shaggy.
fuente
kTse puede reemplazarfpor 1 byteC (gcc) , 41 bytes
Pruébalo en línea!
fuente
r;f(n,k){for(r=1;n>0;n-=k)r*=n;n=r;}para C (gcc)MathGolf ,
76 bytesPruébalo en línea!
¡Encontré una manera inteligente de manejar 0! sin cambiar los otros casos de prueba. Toma la entrada como
k n(orden inverso), lo que ayuda con el estallido implícito.Explicación
fuente
Agregado ,
2119 bytesPruébalo en línea! Implementación recursiva bastante directa. (Nota:
truees esencialmente1, ya que se puede usar en operaciones aritméticas como1.) Este es uno de los pocos programas que he escrito para este sitio donde usar un operador unicode ahorra bytes (1, para ser precisos).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 _]}fuente
Óxido ,
927361 bytesEstoy empezando a aprender el óxido, así que estoy seguro de que esto puede ser más corto. Se actualizará a medida que aprendo. El valor de retorno debe ser
i128para calcular la última prueba.Editar: La recursión es más corta.
Pruébalo en línea!
Puede agregar su propia prueba o editar una de las ya existentes.
fuente
q ,
59 57 5553 bytesexplicación:
aquí también hay una versión en k (misma lógica),
4241 bytesfuente
Physica , 22 bytes
Pruébalo en línea!
26 bytes
Volver a aprender a usar mi propio "idioma" \ o / ... Si supiera cómo escribir un analizador hace 2 años, esto habría sido de 20 bytes :(
o
Pruébalo en línea!
fuente
Retina , 66 bytes
Pruébalo en línea! El enlace incluye casos de prueba más rápidos. Mauls números sin signos de exclamación. Explicación:
Arreglar
0!.Convierte
na unario y agrega un separador.Restar repetidamente
kdenwhilen>ky recopilar los resultados.Reemplazar
kcon1(en decimal).Multiplica por cada valor intermedio a su vez, convirtiendo a decimal.
fuente
Japt , 8 bytes
Intentalo
fuente
JavaScript (Node.js) , 35 bytes
Pruébalo en línea!
fuente
Adelante (gforth) , 50 bytes
Pruébalo en línea!
Explicación del código
fuente
Perl 5
-Mbigint -p, 45 bytesPruébalo en línea!
fuente
Stax , 6 bytes
Ejecutar y depurarlo
Toma entrada en el formulario
{count} {base}.fuente
Gaia , 6 bytes
Pruébalo en línea!
Toma la entrada como
n,kpor lo que la entrada de3 4sería3!!!!.fuente