Escriba el código más corto que tomará cualquier número real mayor que 1 como entrada y generará su factorial inverso positivo. En otras palabras, responde a la pregunta "¿qué número factorial es igual a este número?". Use la función Gamma para extender la definición de factorial a cualquier número real como se describe aquí .
Por ejemplo:
input=6 output=3
input=10 output=3.390077654
porque 3! = 6
y3.390077654! = 10
Reglas
- Está prohibido utilizar funciones factoriales integradas o funciones gamma, o funciones que dependen de estas funciones.
- El programa debe poder calcularlo con 5 dígitos decimales, con la capacidad teórica de calcularlo con cualquier precisión (debe contener un número que pueda hacerse arbitrario grande o pequeño para obtener una precisión arbitraria)
- Se permite cualquier idioma, gana el código más corto en caracteres.
Hice un ejemplo de trabajo aquí . Echar un vistazo.
Respuestas:
Javascript (116)
¡Magia negra aquí! Da un resultado en pocos milisegundos .
Sólo funciones matemáticas elementales utilizados:
ln
,pow
,exponential
Lástima que LaTeX no sea compatible con codegolf, pero básicamente codifiqué un solucionador newton para
f(y)=gamma(y)-n=0
yx=y-1
(porque lox!
esgamma(x+1)
) y aproximaciones para funciones gamma y digamma.La aproximación gamma es la aproximación de Stirling La aproximación
digamma usa la fórmula de Euler Maclaurin
La función digamma es la derivada de la función gamma dividida por la función gamma:
f'(y)=gamma(y)*digamma(y)
Sin golf:
Casos de prueba :
fuente
n=prompt(M=Math)
Mathematica -
745449La forma correcta será
Si simplemente dejamos la prueba
?NumberQ
, todavía funcionaría, pero arrojaría algunas advertencias desagradables, que desaparecerían si cambiamos a la integración simbólicaIntegrate
, pero esto sería ilegal (supongo), porque la función se convertiría automáticamente enGamma
función. También podemos deshacernos de la función externa de esa manera.De todas formas
Para hacer una entrada correcta, solo defina la función (no puede dejar que MatLab gane)
Si se permitiera el factorial incorporado
Lo anterior no da un número entero (que es el argumento para una verdadera función factorial). Lo siguiente hace:
fuente
NumberQ
requiere prueba de patrón? O parens enE^(-t)
? ¿Está engañando a su vezNIntegrate
aIntegrate
? Probablemente ... :)ised:
7246 caracteresEsto es casi un ajuste perfecto ... hay un "lenguaje" que parece estar destinado precisamente al golf matemático: ised . Su sintaxis ofuscada lo convierte en un código muy corto (sin variables con nombre, solo ranuras de memoria de enteros y muchos operadores versátiles de caracteres únicos). Al definir la función gamma usando una integral, obtuve 80 caracteres aparentemente aleatorios
Aquí, la ranura de memoria $ 4 es una función factorial, se espera que la ranura de memoria $ 6 de función de bisección y la ranura de memoria $ 2 se configuren como entrada (antes de obtener este código). Las ranuras $ 0 y $ 1 son los límites de bisección. Ejemplo de llamada (suponiendo que el código anterior esté en el archivo
inversefactorial.ised
)¡Por supuesto, podrías usar el incorporado! operador, en cuyo caso obtienes 45 caracteres
Cuidado, la precedencia del operador es extraña a veces.
Editar: recordado en línea las funciones en lugar de guardarlas. ¡Derrota a Mathematica con 72 personajes!
Y usando el! Construido obtienes 41.
Un año de actualización atrasada:
Me acabo de dar cuenta de que esto era muy ineficiente. Golfed-down a 60 caracteres:
Si se usa utf-8 (Mathematica también lo hace), llegamos a 57:
Una reescritura un poco diferente puede reducirlo a 46 (o 27 si se usa incorporado):
Los dos últimos caracteres se pueden eliminar si está de acuerdo con que la respuesta se imprima dos veces.
fuente
MATLAB
5447Si elijo los desafíos correctos, MATLAB es realmente bueno para jugar al golf :). En mi código encuentro la solución a la ecuación (ux!) = 0 en la que u es la entrada del usuario, y x la variable a resolver. Esto significa que u = 6 conducirá a x = 3, etc.
La precisión se puede cambiar alterando el límite superior de la integral, que se establece en 99. Al bajar esto, se cambiará la precisión de la salida de la siguiente manera. Por ejemplo para una entrada de 10:
etc.
fuente
Python - 199 caracteres
Ok, entonces necesitarás mucho espacio de apilamiento y mucho tiempo, pero bueno, ¡llegará allí!
Aquí hay otro enfoque con aún más recursividad.
Ambos pueden probarse
>>>f(10,1)
siempre que establezca el límite de recursión alrededor de 10000. Es probable que más de un decimal de precisión no se complete con ningún límite de recursión realista.Incorporando los comentarios y algunas modificaciones, hasta 199 caracteres.
fuente
code-golf
pregunta, por lo que debe proporcionar la respuesta más breve, indicando la duración de su solución.Python 2.7 -
215189 caracteresUso:
Para cambiar la precisión: cambie
1e-5
a un número más pequeño para mayor precisión, un número más grande para peor precisión. Para una mejor precisión, probablemente desee dar un mejor valore
.Esto simplemente implementa la función factorial como
f
, y luego realiza una búsqueda binaria para afinar el valor más preciso de la inversa de la entrada. Asume que la respuesta es menor o igual a 99 (seguro que no funcionaría para una respuesta de 365, obtengo un error de desbordamiento matemático). Uso de espacio y tiempo muy razonable, siempre termina.Alternativamente, reemplace
if abs(n-f(x))<=10**-5: print x;break
conprint x
para afeitar 50 caracteres . Se repetirá para siempre, brindándote una estimación cada vez más precisa. Sin embargo, no estoy seguro de si esto encajaría con las reglas.fuente
cat file | wc -c
.dg -
131133 bytesComo dg produce el bytecode de CPython, esto también debería contar para Python, pero oh ... Algunos ejemplos:
EDITAR: ¡Agregué dos bytes porque no recordaba que también debería aceptar flotantes!
fuente
42.8006566063
, por lo que coinciden con 5 dígitos de precisión!1e100
da:,69.95780520000001
para1e150
que salga96.10586423000002
, mientras que para1e200
explota. Pero realmente no sé si esos resultados son confiables ...R , 92 bytes
Una función,
g
que toma entradasz
y salidas el factorial inverso de ese númeroEs casi seguro que se puede sacar más partido de esto, así que si ve algo que pueda mejorar, avíseme.
Pruébalo en línea!
No golfista y comentado
Pruébalo en línea!
fuente
Javascript (¡sin usar bucles!)
Para hacer esto, utilicé una aproximación numérica bien conocida de la inversa de la aproximación factorial de Stirling (y también me inspiré en este ... código de tos ... tos de otra persona ...)
fuente