¡No debe confundirse con Find the factorial!
Introducción
El factorial de un entero n
se 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!
igual1
por 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 ejemplo3
no 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
c
variable realmente almacena el valor de la comparación entren
y0
.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Ṛ
m
P
fuente
RṚ
m
P
r1mP
.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%a
Pyth , 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²ιн0KP
para 8 bytes?0K
deberí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ιнP
guarda 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 losmul
clobbers de 1 operando son RDX, y no queremos que los prefijos REX accedan a R8 / R9.n
no 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=0
caso especial, dejando de lado eljrcxz
.Para el factorial estándar, usaría en
loop
lugar de sub / ja para guardar 2 bytes, pero por lo demás exactamente el mismo código.Llamada de prueba que pasa
argc
comok
, conn
codificación fija.fuente
APL (Dyalog Unicode) , SBCS de 11 bytes
Función de infijo tácito anónimo. Toma
n
como argumento correcto yb
como argumento izquierdo.Pruébalo en línea!
×∘⍳
se multiplicanb
por los Ɩ ntegers 1 a travésn
⊢-
restar eso den
⊢,
anteponern
1⌈
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
Range
para 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 deTimes
Java 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
kT
se puede reemplazarf
por 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:
true
es 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
i128
para 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
n
a unario y agrega un separador.Restar repetidamente
k
den
whilen>k
y recopilar los resultados.Reemplazar
k
con1
(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
,k
por lo que la entrada de3 4
sería3!!!!
.fuente