Desafio
O desafio é escrever um programa que considere os coeficientes de qualquer equação polinomial de n grau e retorne os valores integrais de x para os quais a equação é verdadeira. Os coeficientes serão fornecidos como entrada na ordem de potência decrescente ou crescente. Você pode assumir que todos os coeficientes sejam inteiros .
Entrada e saída
A entrada será os coeficientes da equação em ordem decrescente ou crescente de potência. O grau da equação, ou seja, a potência máxima de x, é sempre 1 menor que o número total de elementos na entrada.
Por exemplo:
[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)
Sua saída deve ser apenas os valores integrais distintos de x que satisfazem a equação dada. Todos os coeficientes de entrada são números inteiros e o polinômio de entrada não será um polinômio zero . Se não houver solução para a equação fornecida, a saída será indefinida.
Se uma equação tiver raízes repetidas, exiba essa raiz específica apenas uma vez. Você pode emitir os valores em qualquer ordem. Além disso, suponha que a entrada conterá pelo menos 2 números.
Exemplos
[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] -> -
Observe que a equação no segundo exemplo também tem a raiz 0.2, mas não é exibida como 0.2 não é um número inteiro.
Pontuação
Isso é código-golfe , então o código mais curto (em bytes) vence!
Respostas:
MATL ,
1312 bytesExperimente online!
Isso usa o fato de que, para coeficientes inteiros, o valor absoluto de qualquer raiz é estritamente menor que a soma dos valores absolutos dos coeficientes.
Explicação
Considere a entrada
[1 5 6]
como um exemplo.fonte
X>t_w&:GyZQ~)
, mas ainda com 13 bytes #Casca ,
109 bytes-1 byte graças a Zgarb
Experimente online!
Explicação
fonte
ṁṡ
vez deoṡ►a
se desduplicar mais tarde.Haskell , 54 bytes
Experimente online!
Força bruta e divisão sintética.
Ungolfed with UniHaskell and
-XUnicodeSyntax
Solução alternativa, 44 bytes
Crédito para nimi.
Boa sorte em tentar online , pois isso verifica todos os números no
Int
intervalo de uma.fonte
i
sobre[minBound..]
e soltar o todot
coisa. Liguef
comInt
listas explícitas , por exemplof [1::Int,5,6]
. Claro que isso não termina em um tempo razoável.Bounded
tipos param emmaxBound
, por exemploprint [minBound::Bool ..]
.Python 2 + numpy,
959391103939182 bytes-2 bytes graças a ovs
obrigado Luis Mendo pelos limites superior / inferior das raízes
-10 bytes graças a Mr. Xcoder
Experimente online!
fonte
numpy.polyval
economiza alguns bytesWolfram Language (Mathematica) ,
5047422527 bytesExperimente online!
Atualização: usando o fato de Luis Mendo, jogamos mais 3 bytes
Ficando mais desonesto com os limites, podemos reduzir mais 5 bytes por @Não é uma sugestão da árvore:
Depois de postar isso, o OP comentou a permissão de "polinômios nativos", então aqui está uma solução de 25 bytes que aceita o polinômio como entrada. Isso funciona porque, por padrão, o Mathematica fatora polinômios sobre os números inteiros, e quaisquer raízes racionais aparecem em uma forma como
m*x+b
essa que falha na correspondência de padrões.Como @alephalpha apontou, isso falhará no caso em que zero é uma raiz, para corrigir que podemos usar o
Optional
símbolo:
Isso analisa o Mathematica 11.0.1, mas falha e requer um conjunto extra de parênteses
b_:0
na versão 11.2. Isso leva até 27 bytes, além de mais dois após a versão 11.0.1. Parece que uma "correção" foi colocada aquiExperimente Online!
fonte
#.#
vez deTr@Abs@#
: é um limite pior, mas menos bytes.Wolfram Language (Mathematica) ,
332631 bytesCorrigido um erro observado por Kelly Lowder nos comentários.
Experimente online!
Soluções incorretas anteriores:
Acabei de notar que, para nenhuma solução inteira, a saída é indefinida em vez de lista vazia; que permite remover alguns bytes.
Experimente online!
Agora, se nenhuma solução inteira existir, a função retornará
x
.Anteriormente:
Experimente online!
fonte
Union
consertar isso.Solve
: a lista de variáveis pode ser omitida.R ,
61bytesUm agradecimento especial a @mathmandan por apontar minha abordagem (incorreta) pode ser salvo e jogado golfe!
Experimente online!
Toma entrada como uma lista de coeficientes em ordem crescente , isto é,
c(-1,0,1)
representa-1+0x+1x^2
.Usando o teorema da raiz racional, a seguinte abordagem quase funciona, por 47 bytes:
Experimente online!
-p:p
gera um intervalo simétrico (com um aviso), utilizando apenas o primeiro elemento dep
,a_0
. Pelo teorema da raiz racional , todas as raízes racionais deP
devem ter a forma emp/q
que sep
dividea_0
e seq
dividea_n
(mais ou menos). Portanto, usar justa_0
é suficiente para|a_0|>0
, como para qualquerq
,|p/q|<=a_0
. No entanto, quandoa_0==0
, como então, qualquer número inteiro divide0
e, portanto, isso falha.No entanto, mathmandan ressalta que, realmente, neste caso, isso significa que há um fator constante
x^k
disso que pode ser fatorado e, assumindo quek
é o máximo, vemos queEm seguida, aplicamos o Teorema da Raiz Racional a
Q(x)
e, comoa_k
é garantido, diferente de zero pela máxima dek
,a_k
fornece um limite arrumado para as raízes inteiras deQ
, e as raízes deP
são as raízes deQ
zero e, portanto, teremos todo o número inteiro. raízes daP
aplicação deste método.Isso é equivalente a encontrar o primeiro coeficiente diferente de zero do polinômio,
t=p[!!p][1]
e usá-lo em vez do ingênuop[1]
como limites. Além disso, como o intervalo-t:t
sempre contém zero, a aplicaçãoP
a esse intervalo ainda nos daria zero como raiz, se é que é.ungolfed:
fonte
max
valores absolutos em vez dossum
; isso não mudaria a contagem de bytes, mas deveria melhorar o desempenho.) De qualquer forma, sim, pena que a versão mais curta não funcionea_0==0
. Existe alguma maneira curta de R procurar o primeiro coeficiente diferente de zero (com potências ascendentes) e usá-lo? Isso corresponderia a factoring o maior número x de possível primeira (naturalmente, então você tem que lembrar de saída0
também, que presumivelmente custar alguns bytes.)max
seria mais eficiente, mas, para o seu segundo ponto, como não preciso me preocupar com a saída,0
pois ela é gerada pelo intervalo-t:t
(ondet
está o primeiro coeficiente diferente de zero), ele economiza 2 bytes!Gelatina , 8 bytes
Experimente online! ou como uma suíte de teste!
Quão?
Baseado na resposta de Luis . Uma alternativa .
fonte
Ær+.Ḟ
?[1,2,3]
.[10,-42,8]
, certo?Oitava ,
5949 bytesExperimente online!
Esta é uma porta da minha resposta R . A única diferença é que eu tenho que usar
sign(t)
eend
gerar explicitamente o intervalo e que ele precisapolyval
calcular o polinômio.Recebe entrada como um vetor de linha de coeficientes em ordem decrescente.
fonte
Pari / GP , 31 bytes
Fatora o polinômio e escolhe os fatores cujos derivativos são 1.
Experimente online!
fonte
C (gcc) ,
127126123 bytesl+~j++
paral-++j
.Experimente online!
Explicação
C (gcc) , 517 bytes
Experimente online!
fonte
l+~j++
pode serl-++j
Java 8,
141140 bytesInspirado por resposta Python 2 de @Rod (sua versão de 82 bytes) .
Desafio divertido! Eu certamente aprendi muito disso ao investigar sobre polinômios e ver como alguns outros aqui o fizeram.
Explicação:
Experimente online.
fonte
Oitava com Pacote Simbólico, 63 bytes
Experimente online!
fonte
05AB1E , 8 bytes
Experimente online!
fonte
JavaScript (ES6), 97 bytes
Toma coeficientes em ordem decrescente de potência e resultados de saída em ordem decrescente.
fonte
Limpo ,
11091 bytesExperimente online!
fonte
Python 2 , 89 bytes
Experimente online!
fonte