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ṡ►asi deduplicas más tarde.Haskell , 54 bytes
Pruébalo en línea!
Fuerza bruta y división sintética.
Ungolfed con UniHaskell y
-XUnicodeSyntaxSolución alternativa, 44 bytes.
Crédito a nimi.
Buena suerte al intentarlo en línea , ya que esto verifica cada número en
Intel rango de un.fuente
imás[minBound..]y soltar toda latcosa. LlamefconIntlistas explícitas , por ejf [1::Int,5,6]. Por supuesto, esto no termina en un tiempo razonable.Boundedtipos 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.polyvalguarda 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+besa 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
Optionalsímbolo:Esto analiza Mathematica 11.0.1 pero falla y requiere un conjunto adicional de paréntesis
b_:0en 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
Unionarreglar 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:pgenera 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 racionalesPdeben tener la formap/qen quepdividea_0yqdividea_n(más o menos). Por lo tanto, usando sóloa_0es 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^kque puede ser factorizado, y, suponiendo queksea máximo, vemos queLuego aplicamos el teorema de la raíz racional a
Q(x), y comoa_kse garantiza que no es cero por la maximidad dek,a_kproporciona un límite ordenado para las raíces enteras deQ, y las raíces dePson las raíces deQjunto con cero, por lo que tendremos todo el entero raíces dePmediante 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:tsiempre contiene cero, se aplicaPa este rango aún nos daría cero como raíz, si es que lo es.sin golf:
fuente
maxvalores 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)maxsería más eficiente, pero para su segundo punto, ya que no tengo que preocuparme por la salida,0ya que es generado por el rango-t:t(¿dóndetestá 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?
ASŒRḅ @ Ðḟ || Programa completo (enlace monádico). AS || Suma los valores absolutos. ŒR || Y cree el rango simétrico inclusivo a partir de su valor negativo. Ðḟ || Y descarte aquellos que producen un valor verdadero ... ḅ @ || Al conectarlos al polinomio (usa conversión de base).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)yendgenerar el rango, y que tienepolyvalque 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-++jJava 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