Su trabajo es convertir los decimales nuevamente en la suma de las raíces cuadradas de los enteros. El resultado debe tener una precisión de al menos 6 dígitos decimales significativos.
Entrada :
Un número que indica el número de raíces cuadradas y un decimal que indica el número a aproximar.
Entrada de ejemplo:
2 3.414213562373095
Salida : enteros separados por espacios que, cuando se enraizan y se suman, tienen aproximadamente el decimal original con una precisión de al menos 6 dígitos decimales significativos.
Los ceros no están permitidos en la solución.
Si hay varias soluciones, solo tiene que imprimir una.
Ejemplo de salida (en cualquier orden):
4 2
Esto funciona porque Math.sqrt(4) + Math.sqrt(2) == 3.414213562373095
.
Este es el código de golf. ¡El código más corto (con bonificación opcional) gana!
Siempre habrá una solución, pero -10 si su programa imprime "No" cuando no hay una solución con enteros. Además, -10 si su programa imprime todas las soluciones (separadas por nuevas líneas o punto y coma o lo que sea) en lugar de solo una.
Casos de prueba:
3 7.923668178593959 --> 6 7 8
2 2.8284271247461903 --> 2 2
5 5.0 --> 1 1 1 1 1
5 13.0 --> 4 4 9 9 9 --> 81 1 1 1 1 --> 36 9 4 1 1 etc. [print any, but print all for the "all solutions bonus"]
Y sí, su programa tiene que terminar en tiempo finito usando memoria finita en cualquier máquina razonable. No solo puede funcionar "en teoría", tienes que ser capaz de probarlo.
fuente
6 7 8
segundo bono?Respuestas:
Pitón 3, 90-10 = 80
(Mega gracias a @xnor por los consejos, especialmente la reestructuración del ciclo for en un tiempo)
Un simple intento recursivo. Comienza con el número objetivo y resta continuamente raíces cuadradas hasta que llega a 0 o menos. La función
S
se puede llamar comoS(2,3.414213562373095)
(se supone que el segundo argumento es positivo).El programa no solo imprime todas las soluciones, imprime todas las permutaciones de soluciones (un poco extraño, lo sé). Aquí está la salida para el último caso: Pastebin .
Un ligero ajuste proporciona una solución 98-10 = 88 que no imprime permutaciones, lo que la hace más eficiente:
Y solo por diversión, este 99 - 10 = 89 es lo más eficiente posible (a diferencia de los otros, no vuela la pila
S(1,1000)
:Tenga en cuenta que, aunque tenemos un argumento predeterminado mutable, esto nunca causa un problema si volvemos a ejecutar la función, ya que
n+[i]
crea una nueva lista.Prueba de corrección
Para terminar en un bucle infinito, debemos alcanzar algún punto donde x <0 y 0.1 + x 2 > 1 . Esto se logra haciendo x <-0.948 ... .
Pero tenga en cuenta que comenzamos desde x positivo y x siempre está disminuyendo, por lo que para golpear x <-0.948 ... debemos haber tenido x '- i 0.5 <-0.948 ... para algunos x'> -0.948 .. . antes de xy entero positivo i . Para que se ejecute el ciclo while, también debemos haber tenido 0.1 + x ' 2 > i .
Reordenando obtenemos x ' 2 + 1.897x' + 0.948 <i <0.1 + x ' 2 , las partes externas implican que x' <-0.447 . Pero si -0,948 <x'<-0,447 , entonces número entero no positivo i puede caber la brecha en la desigualdad anterior.
Por lo tanto, nunca terminaremos en un bucle infinito.
fuente
abs
conx*x<1e-12
.while
bucle funciona para reemplazar elfor
:,while.1+x*x>i:S(x-i**.5,n+[i]);i+=1
habiéndose inicializadoi=1
en los parámetros de la función. La idea es evitar la necesidad de convertir aint
s. El.1
es manejar imprecisiones de flotación; Creo que es seguro contra bucles infinitos.N
ahora con un argumento de función, es más corto recurrir hacia abajoN-1
y verificar cuándo enN==0
lugar delen(n)==N
..1
es seguro; Puedo chatear con usted una discusión si lo desea.Prólogo ECLiPSe - 118 (138-20)
Usé la siguiente implementación de Prolog: http://eclipseclp.org/
Este es un enfoque exponencial muy ingenuo. Enumerar todas las soluciones posibles lleva tiempo para cubrir todas las combinaciones ( editar : el rango de enteros visitados ahora disminuye en cada paso, lo que elimina muchas combinaciones inútiles).
Aquí sigue una transcripción de una sesión de prueba. Por defecto, el entorno intentará encontrar todas las soluciones posibles (-10) e imprimirá "No" cuando no lo haga (-10).
Como Sp3000 señaló correctamente en el comentario, también imprime "Sí" cuando tiene éxito. Eso seguramente significa que puedo eliminar 10 puntos más ;-)
(Editar) En cuanto al rendimiento, es bastante bueno, al menos en comparación con otros (ver, por ejemplo, este comentario de FryAmTheEggman ). Primero, si desea imprimir todos los resultados, agregue el siguiente predicado:
Ver http://pastebin.com/ugjfEHpw para el caso (5,13.0), que se completa en 0.24 segundos y encontrar 495 soluciones (pero tal vez me faltan algunas soluciones, no lo sé).
fuente
Erlang
305-10302-10Esta función devuelve la cadena "No" o una cadena con valores separados por espacios. (Ineficientemente) procesa todos los valores posibles que los codifican en un número entero grande y comienzan con valores más altos. 0 no están permitidos en la solución, y 0 codificado representa todos. El error es al cuadrado.
Ejemplo:
Tenga paciencia
f(5,13.0)
ya que el espacio de búsqueda de funciones es 13 ^ 10. Se puede hacer más rápido con 2 bytes adicionales.fuente
Pitón
32:173159-10= 149Explicación: Cada solución tiene la forma x_1 x_2 ... x_n con 1 <= x_1 <= x ^ 2 donde x es la suma objetivo. Por lo tanto, podemos codificar cada solución como un entero en la base x ^ 2. El ciclo while itera sobre todas las posibilidades (x ^ 2) ^ n. Luego convierto el entero de nuevo y pruebo la suma. Muy claro.
Encuentra todas las soluciones, pero el último caso de prueba lleva demasiado tiempo.
fuente
JavaScript (ES6) 162 (172-10)
173Editar Un poco más corto, un poco más lento.
Como una función con 2 parámetros, salida a la consola javascript. Esto imprime todas las soluciones sin repeticiones (las tuplas de soluciones se generan ya ordenadas).
Me preocupaba más el tiempo que el recuento de caracteres, por lo que se prueba fácilmente en una consola del navegador dentro del límite de tiempo estándar de JavaScript.
(Actualización de febrero de 2016) Hora actual para el último caso de prueba: aproximadamente 1
150 segundos. Requisitos de memoria: insignificante.Versión ES 5 Cualquier navegador
Test Snippet debería ejecutarse en cualquier navegador reciente
( Editar ) A continuación se muestran los resultados en mi PC cuando publiqué esta respuesta hace 15 meses. Lo intenté hoy y es 100 veces más rápido en la misma PC, ¡solo con una versión alfa de 64 bits de Firefox (y Chrome se queda muy atrás)! - hora actual con Firefox 40 Alpha 64 bit: ~ 2 segundos, Chrome 48: ~ 29 segundos
Salida (en mi PC: el último número es el tiempo de ejecución en milisegundos)
fuente
Mathematica - 76-20 = 56
Ejemplos
fuente
No
? Además, la salida no está separada por espacios. Además, ¿no puedes usar enTr@
lugar dePlus@@
? Y es posible que pueda guardar algunos caracteres cambiandoSelect
aCases
, la función al final de un patrón, y creandof
una función pura sin nombre.Haskell
8780-10 = 70Este es un algoritmo recursivo similar al programa Python 3 de @ Sp3000. Consiste en una función infija
#
que devuelve una lista de todas las permutaciones de todas las soluciones.Con un puntaje de
102 9992 - 10 = 82 podemos imprimir cada solución solo una vez, ordenadas:fuente
Pyth
55 5447-20 = 27Pruébalo en línea.
Descaradamente toma prestado del comentario de xnor ;)
Esto se quedará sin memoria en cualquier computadora en su sano juicio, incluso por un valor como
5,5.0
. Define una función,g
que se puede llamar comog 3 7.923668178593959
.Este programa de Python 3 usa esencialmente el mismo algoritmo (simplemente no hace la impresión "No" al final, lo que podría hacerse asignando una variable a todos los resultados, luego escribiendo
print(K if K else "No")
), pero usa un generador, por lo que no No se produce un error de memoria (aún llevará mucho tiempo, pero lo hice imprimir cuando encuentra los valores):Esto dio exactamente los mismos resultados que obtuvo @ Sp3000. Además, esto tardó varios días en terminar (no lo cronometré, pero alrededor de 72 horas).
fuente
Pitón 3 -
157174169 - 10 = 159Edit1: cambió el formato de salida a enteros separados por espacios en lugar de separados por comas. Gracias por la sugerencia de quitar las llaves alrededor (n, x).
Edit2: ¡Gracias por los consejos de golf! Puedo recortar otros 9 caracteres si solo uso una prueba == en lugar de probar la igualdad aproximada dentro de 1e-6, pero eso invalidaría las soluciones aproximadas, si existe alguna.
Utiliza itertools para generar todas las combinaciones de enteros posibles, con suerte eficientemente :)
No he encontrado una manera de agregar la impresión "No" de manera eficiente, siempre parece tener más de 10 caracteres adicionales.
fuente
n,x
.SyntaxError
s cuando pruebo laeval
línea ...from itertools import*
ahorra 1, eliminando el espacioz**.5for
ahorra 1, y la eliminación de la[]
ensum(z**.5for z in c)
ahorra 2 y la eliminación de la()
enif(...)
ahorra 1.n,x=input()
más compacto?Scala (397 bytes - 10)
Si no hay permutaciones, este programa no imprime nada.
fuente