En matemáticas, el "hecho" factorial acortado de un entero no negativo n , denotado por n! , es el producto de todos los enteros positivos menores o iguales que n . Por ejemplo, 5! es 1 * 2 * 3 * 4 * 5 = 120
El factorial de 0 es 1 , según la convención para un producto vacío.
Estos son los hechos habituales a los que estamos acostumbrados. Agreguemos algunas alternativas:
- El factorial (definido anteriormente)
- El doble factorial: n !! = 1 + 2 + ... + n
- El factorial triple: n !!! = 1 - (2 - (3 - (... - n))) ...)
- El factorial cuádruple: n !!!! = 1 / (2 / (3 ... / n))) ...) . Nota: Esta es una división de punto flotante, no una división entera.
Desafío
Tome una entrada entera no negativa n , seguida directamente por entre 1 y 4 signos de exclamación. La entrada se verá (exactamente) así: 0! , 5 !! , 132 !!! o 4 !!!! . En este desafío, no puede asumir un formato de entrada flexible, lo siento.
Salida
La salida debe ser el resultado, en cualquier formato conveniente. ¡El resultado del factorial cuádruple debe tener al menos 2 dígitos después del punto decimal, excepto 0! = 0 .
Casos de prueba:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
---
0!! = 0
1!! = 1
2!! = 3
3!! = 6
4!! = 10
5!! = 15
6!! = 21
7!! = 28
8!! = 36
9!! = 45
10!! = 55
---
0!!! = 0
1!!! = 1
2!!! = -1
3!!! = 2
4!!! = -2
5!!! = 3
6!!! = -3
7!!! = 4
8!!! = -4
9!!! = 5
10!!! = -5
---
0!!!! = 0
1!!!! = 1
2!!!! = 0.5
3!!!! = 1.5
4!!!! = 0.375
5!!!! = 1.875
6!!!! = 0.3125
7!!!! = 2.1875
8!!!! = 0.27344
9!!!! = 2.4609
10!!!! = 0.24609
La solución más corta en cada idioma gana.
0!
->1
.Respuestas:
JavaScript (ES6), 88 bytes
Casos de prueba
Mostrar fragmento de código
Formateado y comentado
fuente
Casco , 15 bytes
Pruébalo en línea!
Explicación
Indexación en una lista de funciones: las alegrías de usar un lenguaje funcional.
Utilizo un rango descendente y pliegues izquierdos,
-
y/
tomo sus argumentos en orden inverso en Husk.fuente
Indexing into a list of functions
is woah ...C # (.NET Core) ,
134 130128 bytesPruébalo en línea!
La mejor parte del golf de código son las cosas que aprende al tratar de resolver los desafíos. En este, he aprendido que en C # puede recortar otros caracteres además de espacios en blanco de las cadenas.
s.Split('!').Length
, solo arregle los límites ene>4?i/r:e>3?i-r:e>2?i+r:i*r
yn<1&e<3?1:r
.fuente
e
n
yi
tambiéndouble
evitar declararlo para que r guarde 4 bytes.float
para guardar otro byte.Perl 5 , 62 bytes
Código de 61 bytes + 1 para
-p
.¡Gracias a @GB por señalar una falta de mi parte!
Pruébalo en línea! (esto se usa
-l
para facilitar la lectura)fuente
R ,
113111 bytes¡Prueba algunos casos de prueba!
sin golf:
fuente
el(strsplit(s,"!"))
ahorra 1 bytePython3,
124130121119 bytesEn este punto, creo que la recursividad es la clave para ahorrar más bytes.
Pruebe los casos de prueba en ¡ Pruébelo en línea!
-9 bytes gracias a @ Mr.Xcoder !
-2 bytes gracias a @Felipe Nardi Batista !
fuente
Pyth ,
3430 bytesPruébalo en línea!
Explicación
fuente
.U
guarda un byte.05AB1E , 27 bytes
Pruébalo en línea!
fuente
„.»
no funciona?»
es parte de una cadena comprimida inacabada, por lo que produce errores y, como suele ocurrir en 05AB1E, el error se ignora."*+-/"èU
luego de usar elL
seguimiento con,.»X
pero se trataX
como una cadena, no como un comando, y.»X.V
es aún más extraño.X
no evalúa .X.V
Son dos comandos.Ruby ,
83 8079 bytesPruébalo en línea!
Explicación:
fuente
Java 8,
141136134 bytes-5 bytes (141 → 136) gracias a la respuesta C # de @CarlosAlejo .
Explicación:
Pruébalo aquí
fuente
float
es más corto quedouble
.float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)
a la respuesta actual me ahorró 5 bytes. :) Olvidé agregar una parte de " bytes guardados gracias a " que noté ahora. Lo siento.Jalea ,
24 23 2625 bytes+
32 bytes parcheando para arreglar después de una mala interpretación :(Un programa completo (un enlace monádico con enlaces de ayuda referenciados por la ubicación del programa)
Pruébalo en línea! o ver un conjunto de pruebas .
¿Cómo?
fuente
0!
./
en una lista vacía. D: EDITAR: aparentemente válido para0!
,0!!
,0!!!
y0!!!!
1.Código de máquina x86_64 auto modificable, 123 bytes
¿Por qué los idiomas interpretados podrían ejecutar código dinámicamente con
eval
s sofisticados , pero no con código de máquina simple?Pruébalo con:
Montaje:
Las explicaciones se agregarán más tarde. La idea básica es modificar la
divss xmm0, xmm1
instrucción en0x100000db0
y sustituirla por unamulss
,addss
,subss
odivss
de acuerdo con el operando suministrado. También se usa un pequeño truco para analizar la cadena de entrada.Asamblea generada con:
fuente
Haskell
105102 9896 bytesGuardado 9 bytes gracias a Zgarb y nimi.
Pruébalo en línea.
fuente
read n
, yf=
es innecesario según nuestras reglas .lex
salva dos bytes:f s|[(n,b)]<-lex s=read n!(length b-1)
.lex
. ¡Eso es genial! :) No veo cómo eso ahorra bytes, obtengo 99 bytes después de esto.Gaia ,
2625 bytesPruébalo en línea!
Explicación
fuente
Jalea , 28 bytes
Pruébalo en línea!
Se me ocurrió la idea de separar los enlaces en líneas de la respuesta de Jonathan Allan para -2 bytes.
fuente
APL (Dyalog) , 30 bytes
Inspirado en la solución de lstefano .
Pruébalo en línea!
{
...}
función anónima donde el argumento está representado por⍵
:0::
Si ocurre algún error:0
devolver cero⋄
ahora intenta:⍵∩⎕D
la intersección del argumento y el conjunto de D igits (elimina los signos de exclamación)⍎
ejecutar eso (lo convierte en un número)⍳
d nices de eso(
...)/
inserte (APL es asociativo correcto, según sea necesario) la siguiente función entre términos:⍵~⎕D
argumento sin D igits (deja signos de exclamación)≢
cuenta eso (es decir, cuántos puntos de exclamación)'×+-⌹'⊃⍨
use eso para elegir de la lista de símbolos *⍎
ejecutar (convierte el símbolo en una función)⌹
(división de matriz) se usa en lugar de÷
(división normal) para causar un error en una lista vacíafuente
::
en un dfn?::
sucedido, entonces el valor a la derecha de la::
se devuelve inmediatamente.Perl 5 , 96 bytes
Pruébalo en línea!
fuente
Dyalog APL, al menos 29 caracteres
La expresión es casi correcta. Pasa todos los casos de prueba, EXCEPTO
0!!!!
para lo que da en1
lugar de lo requerido,0
y eso se debe a que en APL la reducción de un vector vacío debe devolver el elemento neutral para la función utilizada para reducir. Para el cociente que es 1. Por el momento no tengo tiempo para tratar de arreglarlo, pero lo dejaré aquí para un día lluvioso.fuente
{0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D}
Pruébelo en línea!05AB1E ,
2524 bytesPruébalo en línea!
fuente
Mathematica, 152 bytes
fuente
Javascript,
111163 bytesVersión legible
fuente