Desafío
El desafío es escribir un programa que tome los coeficientes de cualquier ecuación polinómica de n grados como entrada y devuelva los valores integrales de x para los que la ecuación es verdadera. Los coeficientes se proporcionarán como entrada en el orden de potencia decreciente o creciente. Puede asumir que todos los coeficientes son enteros .
Entrada y salida
La entrada será los coeficientes de la ecuación en orden decreciente o creciente de potencia. El grado de la ecuación, es decir, la potencia máxima de x, es siempre 1 menor que el total de elementos en la entrada.
Por ejemplo:
[1,2,3,4,5] -> represents x^4 + 2x^3 + 3x^2 + 4x + 5 = 0 (degree = 4, as there are 5 elements)
[4,0,0,3] -> represents 4x^3 + 3 = 0 (degree = 3, as there are 3+1 = 4 elements)
Su salida debe ser solo los distintos valores integrales de x que satisfacen la ecuación dada. Todos los coeficientes de entrada son enteros y el polinomio de entrada no será un polinomio cero . Si no hay una solución para la ecuación dada, entonces la salida no está definida.
Si una ecuación tiene raíces repetidas, muestre esa raíz en particular solo una vez. Puede generar los valores en cualquier orden. Además, suponga que la entrada contendrá al menos 2 números.
Ejemplos
[1,5,6] -> (-3,-2)
[10,-42,8] -> (4)
[1,-2,0] -> (0,2)
[1, 1, -39, -121, -10, 168] -> (-4, -3, -2, 1, 7)
[1, 0, -13, 0, 36] -> (-3, -2, 2, 3)
[1,-5] -> (5)
[1,2,3] -> -
Tenga en cuenta que la ecuación en el segundo ejemplo también tiene la raíz 0.2, pero no se muestra ya que 0.2 no es un número entero.
Puntuación
Este es el código de golf , por lo que gana el código más corto (en bytes).
Respuestas:
MATL ,
1312 bytesPruébalo en línea!
Esto usa el hecho que, para coeficientes enteros, el valor absoluto de cualquier raíz es estrictamente menor que la suma de los valores absolutos de los coeficientes.
Explicación
Considere la entrada
[1 5 6]
como un ejemplo.fuente
X>t_w&:GyZQ~)
, pero aún 13 bytesCasco ,
109 bytes-1 byte gracias a Zgarb
Pruébalo en línea!
Explicación
fuente
ṁṡ
lugar deoṡ►a
si deduplicas más tarde.Haskell , 54 bytes
Pruébalo en línea!
Fuerza bruta y división sintética.
Ungolfed con UniHaskell y
-XUnicodeSyntax
Solución alternativa, 44 bytes.
Crédito a nimi.
Buena suerte al intentarlo en línea , ya que esto verifica cada número en
Int
el rango de un.fuente
i
más[minBound..]
y soltar toda lat
cosa. Llamef
conInt
listas explícitas , por ejf [1::Int,5,6]
. Por supuesto, esto no termina en un tiempo razonable.Bounded
tipos se detienen enmaxBound
, por ejemploprint [minBound::Bool ..]
.Python 2 + numpy,
959391103939182 bytes-2 bytes gracias a ovs
gracias Luis Mendo por los límites superior / inferior de las raíces
-10 bytes gracias al Sr. Xcoder
Pruébalo en línea!
fuente
numpy.polyval
guarda bastantes bytesWolfram Language (Mathematica) ,
5047422527 bytesPruébalo en línea!
Actualización: usando el hecho de Luis Mendo, jugó otros 3 bytes
Volviendo más descuidado con los límites, podemos reducir estos 5 bytes más por @No la sugerencia de un árbol:
Después de publicar esto, OP comentó que permite "polinomios nativos", así que aquí hay una solución de 25 bytes que acepta el polinomio como entrada. Esto funciona porque por defecto Mathematica factoriza polinomios sobre los enteros, y cualquier raíz racional aparece en una forma como
m*x+b
esa falla la coincidencia de patrones.Como señaló @alephalpha, esto fallará en el caso de que cero sea una raíz, por lo que para solucionarlo podemos usar el
Optional
símbolo:
Esto analiza Mathematica 11.0.1 pero falla y requiere un conjunto adicional de paréntesis
b_:0
en la versión 11.2. Esto ocupa una copia de seguridad de hasta 27 bytes, más dos más después de la versión 11.0.1. Parece que se puso una "solución" aquíPruébalo en línea!
fuente
#.#
lugar deTr@Abs@#
: es un límite peor pero menos bytes.Wolfram Language (Mathematica) ,
332631 bytesSe corrigió un error observado por Kelly Lowder en los comentarios.
Pruébalo en línea!
Soluciones incorrectas anteriores:
Me acabo de dar cuenta de que para una solución sin número entero, la salida no está definida en lugar de una lista vacía; eso permite eliminar algunos bytes.
Pruébalo en línea!
Ahora, si no existe una solución entera, la función devuelve
x
.Previamente:
Pruébalo en línea!
fuente
Union
arreglar eso.Solve
: la lista de variables se puede omitir.R ,
6159 bytes¡Un agradecimiento especial a @mathmandan por señalar mi enfoque (incorrecto) podría salvarse y jugar golf!
Pruébalo en línea!
Toma la entrada como una lista de coeficientes en orden creciente , es decir,
c(-1,0,1)
representa-1+0x+1x^2
.Usando el teorema de la raíz racional, el siguiente enfoque casi funciona, para 47 bytes:
Pruébalo en línea!
-p:p
genera un rango simétrico (con una advertencia) usando sólo el primer elemento dep
,a_0
. Según el teorema de la raíz racional , todas las raíces racionalesP
deben tener la formap/q
en quep
dividea_0
yq
dividea_n
(más o menos). Por lo tanto, usando sóloa_0
es suficiente para|a_0|>0
, como para cualquierq
,|p/q|<=a_0
. Sin embargo, cuandoa_0==0
, como entonces, cualquier entero se divide0
, y por lo tanto esto falla.Sin embargo, Mathmandan señala que realmente, en este caso, esto significa que hay un factor constante
x^k
que puede ser factorizado, y, suponiendo quek
sea máximo, vemos queLuego aplicamos el teorema de la raíz racional a
Q(x)
, y comoa_k
se garantiza que no es cero por la maximidad dek
,a_k
proporciona un límite ordenado para las raíces enteras deQ
, y las raíces deP
son las raíces deQ
junto con cero, por lo que tendremos todo el entero raíces deP
mediante la aplicación de este método.Esto es equivalente a encontrar el primer coeficiente distinto de cero del polinomio
t=p[!!p][1]
y usarlo en lugar de lo ingenuop[1]
como límites. Además, desde el rango-t:t
siempre contiene cero, se aplicaP
a este rango aún nos daría cero como raíz, si es que lo es.sin golf:
fuente
max
valores absolutos en lugar de los valoressum
; esto no cambiaría el recuento de bytes, pero debería mejorar el rendimiento). De todos modos, sí, lástima que la versión más corta no funcionea_0==0
. ¿Hay algún camino corto en R para buscar el primer coeficiente distinto de cero (con potencias ascendentes) y utilizarlo en su lugar? Esto correspondería a factorizar la mayor cantidad posible de x primero (por supuesto, entonces también tendría que recordar la salida0
, lo que presumiblemente costaría algunos bytes)max
sería más eficiente, pero para su segundo punto, ya que no tengo que preocuparme por la salida,0
ya que es generado por el rango-t:t
(¿dóndet
está el primer coeficiente distinto de cero), ahorra 2 bytes!Jalea , 8 bytes
Pruébalo en línea! o como una suite de prueba!
¿Cómo?
Basado en la respuesta de Luis . Una alternativa .
fuente
Ær+.Ḟ
?[1,2,3]
.[10,-42,8]
, ¿verdad?Octava ,
5949 bytesPruébalo en línea!
Este es un puerto de mi R respuesta . La única diferencia es que tengo que usar explícitamente
sign(t)
yend
generar el rango, y que tienepolyval
que calcular el polinomio.Toma la entrada como un vector fila de coeficientes en orden decreciente.
fuente
Pari / GP , 31 bytes
Factores del polinomio, y selecciona los factores cuyas derivadas son 1.
Pruébalo en línea!
fuente
C (gcc) ,
127126123 bytesl+~j++
al-++j
.Pruébalo en línea!
Explicación
C (gcc) , 517 bytes
Pruébalo en línea!
fuente
l+~j++
se puede jugar al golfl-++j
Java 8,
141140 bytesInspirado por la respuesta Python 2 de @Rod (su versión de 82 bytes) .
Desafío divertido! Ciertamente aprendí mucho al investigar sobre polinomios y ver cómo otros aquí lo han hecho.
Explicación:
Pruébalo en línea.
fuente
Octava con paquete simbólico, 63 bytes
Pruébalo en línea!
fuente
05AB1E , 8 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 97 bytes
Toma coeficientes en orden decreciente de potencia y produce resultados en orden descendente.
fuente
Limpio ,
11091 bytesPruébalo en línea!
fuente
Python 2 , 89 bytes
Pruébalo en línea!
fuente