Défi
Le défi consiste à écrire un programme qui prend en entrée les coefficients de toute équation polynomiale à n degrés et renvoie les valeurs intégrales de x pour lesquelles l'équation est vraie. Les coefficients seront fournis en entrée dans l'ordre de puissance décroissante ou croissante. Vous pouvez supposer que tous les coefficients sont des entiers .
Entrée et sortie
L'entrée sera les coefficients de l'équation en ordre décroissant ou croissant de puissance. Le degré de l'équation, c'est-à-dire la puissance maximale de x, est toujours inférieur de 1 au nombre total d'éléments dans l'entrée.
Par exemple:
[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)
Votre sortie ne doit être que les valeurs intégrales distinctes de x qui satisfont l'équation donnée. Tous les coefficients d'entrée sont des entiers et le polynôme d'entrée ne sera pas un polynôme nul . S'il n'y a pas de solution pour l'équation donnée, alors la sortie n'est pas définie.
Si une équation a des racines répétées, affichez cette racine particulière une seule fois. Vous pouvez sortir les valeurs dans n'importe quel ordre. Supposons également que l'entrée contienne au moins 2 chiffres.
Exemples
[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] -> -
Notez que l'équation dans le deuxième exemple a également la racine 0,2, mais elle n'est pas affichée car 0,2 n'est pas un entier.
Notation
C'est le code-golf , donc le code le plus court (en octets) gagne!
Réponses:
MATL ,
1312 octetsEssayez-le en ligne!
Cela utilise le fait que, pour les coefficients entiers, la valeur absolue de toute racine est strictement inférieure à la somme des valeurs absolues des coefficients.
Explication
Considérez l'entrée
[1 5 6]
comme exemple.la source
X>t_w&:GyZQ~)
- être , mais toujours 13 octetsHusk ,
109 octets-1 octet grâce à Zgarb
Essayez-le en ligne!
Explication
la source
ṁṡ
au lieu deoṡ►a
si vous dédupliquez plus tard.Haskell , 54 octets
Essayez-le en ligne!
Force brute et division synthétique.
Ungolfed avec UniHaskell et
-XUnicodeSyntax
Solution alternative, 44 octets
Crédit à Nimi.
Bonne chance pour l' essayer en ligne , car cela vérifie chaque numéro dans
Int
la plage d'un.la source
i
plus[minBound..]
déposer toutet
chose. Appelezf
avec desInt
listes explicites , par exemplef [1::Int,5,6]
. Bien sûr, cela ne se termine pas dans un délai raisonnable.Bounded
types s'arrêtent àmaxBound
, par exempleprint [minBound::Bool ..]
.Python 2 + numpy,
959391103 103939182 octets-2 octets grâce aux ovs
merci Luis Mendo pour les bornes supérieures / inférieures des racines
-10 octets merci à M. Xcoder
Essayez-le en ligne!
la source
numpy.polyval
économise pas mal d'octetsWolfram Language (Mathematica) ,
5047422527 octetsEssayez-le en ligne!
Mise à jour: en utilisant le fait de Luis Mendo, a joué encore 3 octets
De plus en plus bâclé avec les limites, nous pouvons réduire ces 5 octets supplémentaires par @Pas une suggestion d'arbre:
Après avoir posté cela, OP a commenté l'autorisation des "polynômes natifs", voici donc une solution de 25 octets qui accepte le polynôme en entrée. Cela fonctionne parce que par défaut Mathematica factorise les polynômes sur les entiers, et toutes les racines rationnelles apparaissent sous une forme comme
m*x+b
celle-ci échoue la correspondance de modèle.Comme l'a souligné @alephalpha, cela échouera dans le cas où zéro est une racine, donc pour corriger cela, nous pouvons utiliser le
Optional
symbole:
Cela analyse finement Mathematica 11.0.1 mais échoue et nécessite un ensemble supplémentaire de parenthèses
b_:0
dans la version 11.2. Cela prend jusqu'à 27 octets, plus deux autres après la version 11.0.1. Il semble qu'un "correctif" ait été ajouté iciEssayez-le en ligne!
la source
#.#
place deTr@Abs@#
: c'est une pire limite mais moins d'octets.Wolfram Language (Mathematica) ,
332631 octetsCorrection d'une erreur notée par Kelly Lowder dans les commentaires.
Essayez-le en ligne!
Solutions incorrectes précédentes:
Je viens de remarquer que pour aucune solution entière, la sortie n'est pas définie au lieu d'une liste vide; cela permet de supprimer quelques octets.
Essayez-le en ligne!
Maintenant, si aucune solution entière n'existe, la fonction retourne
x
.Précédemment:
Essayez-le en ligne!
la source
Union
corriger cela.Solve
: la liste des variables peut être omise.R ,
6159 octetsUn merci spécial à @mathmandan pour avoir souligné que mon approche (incorrecte) pouvait être sauvegardée et jouée au golf !
Essayez-le en ligne!
Prend l'entrée comme une liste de coefficients dans l' ordre croissant , c'est-à-dire,
c(-1,0,1)
représente-1+0x+1x^2
.En utilisant le théorème de la racine rationnelle, l'approche suivante fonctionne très bien, pour 47 octets:
Essayez-le en ligne!
-p:p
génère une série symétrique (avec une mise en garde) en utilisant uniquement le premier élément dep
,a_0
. Selon le théorème de la racine rationnelle , toutes les racines rationnelles deP
doivent être de la formep/q
où sep
divisea_0
et seq
divisea_n
(plus ou moins). Par conséquent, en utilisant seulementa_0
suffit pour|a_0|>0
, comme pour toutq
,|p/q|<=a_0
. Cependant, quanda_0==0
, comme alors, tout entier se divise0
, et donc cela échoue.Cependant, le mathmandan souligne que vraiment, dans ce cas, cela signifie qu'il y a un facteur constant
x^k
qui peut être pris en compte, et, en supposant qu'ilk
est maximal, nous voyons queNous appliquons ensuite le théorème de la racine rationnelle à
Q(x)
, et comme ila_k
est garanti qu'il est différent de zéro par la maximalité dek
,a_k
fournit une borne ordonnée pour les racines entières deQ
, et les racines deP
sont les racines deQ
avec zéro, nous aurons donc tout l'entier racines deP
en appliquant cette méthode.Cela revient à trouver le premier coefficient non nul du polynôme
t=p[!!p][1]
et à l'utiliser à la place du naïfp[1]
comme limites. De plus, comme la plage-t:t
contient toujours zéro, l'appliquerP
à cette plage nous donnerait toujours zéro comme racine, si c'est le cas.non golfé:
la source
max
valeur absolue au lieu de lasum
; cela ne changerait pas le nombre d'octets, mais cela devrait améliorer les performances.) Quoi qu'il en soit, dommage, la version courte ne fonctionne pasa_0==0
. Existe-t-il un moyen court dans R de rechercher le premier coefficient (avec des puissances ascendantes) différent de zéro, et de l'utiliser à la place? Cela correspondrait à la suppression du plus grand nombre de x possible en premier (bien sûr, vous devriez alors vous rappeler de produire0
également, ce qui coûterait probablement quelques octets.)max
serait plus efficace, mais pour votre deuxième point, comme je n'ai pas à me soucier de la sortie0
car il est généré par la plage-t:t
(oùt
est le premier coefficient non nul), il économise 2 octets!Gelée , 8 octets
Essayez-le en ligne! ou comme suite de tests!
Comment?
Basé sur la réponse de Luis . Une alternative .
la source
Ær+.Ḟ
?[1,2,3]
.[10,-42,8]
Octave ,
5949 octetsEssayez-le en ligne!
Ce port est de ma réponse R . La seule différence est que je dois utiliser explicitement
sign(t)
etend
générer la plage, et qu'elle doitpolyval
calculer le polynôme.Prend l'entrée comme un vecteur de coefficients de ligne dans l'ordre décroissant.
la source
Pari / GP , 31 octets
Factorise le polynôme et sélectionne les facteurs dont les dérivées sont 1.
Essayez-le en ligne!
la source
C (gcc) ,
127126123 octetsl+~j++
au golfl-++j
.Essayez-le en ligne!
Explication
C (gcc) , 517 octets
Essayez-le en ligne!
la source
l+~j++
peut être joué aul-++j
Java 8,
141140 octetsInspiré par la réponse Python 2 de @Rod (sa version de 82 octets) .
Défi amusant! J'en ai certainement beaucoup appris en enquêtant sur les polynômes et en voyant comment d'autres ici l'ont fait.
Explication:
Essayez-le en ligne.
la source
Octave avec package symbolique, 63 octets
Essayez-le en ligne!
la source
05AB1E , 8 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 97 octets
Prend les coefficients dans l'ordre décroissant de puissance et les résultats sortent dans l'ordre décroissant.
la source
Nettoyer ,
11091 octetsEssayez-le en ligne!
la source
Python 2 , 89 octets
Essayez-le en ligne!
la source