Herausforderung
Die Herausforderung besteht darin, ein Programm zu schreiben, das die Koeffizienten einer beliebigen n-Grad-Polynomgleichung als Eingabe verwendet und die Integralwerte von x zurückgibt, für die die Gleichung gilt. Die Koeffizienten werden als Eingabe in der Reihenfolge abnehmender oder zunehmender Leistung bereitgestellt. Sie können annehmen, dass alle Koeffizienten ganze Zahlen sind .
Eingabe und Ausgabe
Die Eingabe sind die Koeffizienten der Gleichung in abnehmender oder zunehmender Reihenfolge der Leistung. Der Grad der Gleichung, dh die maximale Potenz von x, ist immer 1 kleiner als die Gesamtanzahl der Elemente in der Eingabe.
Beispielsweise:
[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)
Ihre Ausgabe sollte nur die eindeutigen Integralwerte von x sein, die die angegebene Gleichung erfüllen. Alle Eingabekoeffizienten sind Ganzzahlen, und das Eingabepolynom ist kein Nullpolynom . Wenn es für die angegebene Gleichung keine Lösung gibt, ist die Ausgabe undefiniert.
Wenn eine Gleichung wiederholte Wurzeln hat, zeigen Sie diese bestimmte Wurzel nur einmal an. Sie können die Werte in beliebiger Reihenfolge ausgeben. Nehmen Sie außerdem an, dass die Eingabe mindestens 2 Zahlen enthält.
Beispiele
[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] -> -
Beachten Sie, dass die Gleichung im zweiten Beispiel auch die Wurzel 0,2 hat, aber nicht angezeigt wird, da 0,2 keine ganze Zahl ist.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code (in Bytes)!
Antworten:
MATL ,
13 -12 BytesProbieren Sie es online!
Dies nutzt die Tatsache, dass für ganzzahlige Koeffizienten der Absolutwert einer Wurzel streng kleiner ist als die Summe der Absolutwerte der Koeffizienten.
Erläuterung
Betrachten Sie die Eingabe
[1 5 6]
als Beispiel.quelle
X>t_w&:GyZQ~)
, aber immer noch 13 BytesSchale ,
109 Bytes-1 Byte dank Zgarb
Probieren Sie es online!
Erläuterung
quelle
ṁṡ
statt ,oṡ►a
wenn Sie später dedupliziert.Haskell , 54 Bytes
Probieren Sie es online!
Brute Force und synthetische Teilung.
Ungolfed mit UniHaskell und
-XUnicodeSyntax
Alternative Lösung, 44 Byte
Dank an Nimi.
Ich wünsche Ihnen viel Glück beim Online - Probieren , da hiermit jede Nummer in einem bestimmten
Int
Bereich überprüft wird .quelle
i
über[minBound..]
die ganze und fallent
Sache. Anruff
mit explizitenInt
Listen, zf [1::Int,5,6]
. Natürlich endet dies nicht in angemessener Zeit.Bounded
Typen enden beimaxBound
, zprint [minBound::Bool ..]
.Python 2 + Anzahl,
959391103939182 Bytes-2 Bytes danke an ovs
danke an Luis Mendo für die oberen / unteren Grenzen der Wurzeln
-10 Bytes danke an Mr. Xcoder
Probieren Sie es online!
quelle
numpy.polyval
spart einige BytesWolfram Language (Mathematica) ,
5047422527 BytesProbieren Sie es online!
Update: Unter Verwendung von Luis Mendos Fakt wurden weitere 3 Bytes abgegolft
Wir werden mit den Grenzen schlampiger und können diese 5 Bytes mehr pro @Not-Vorschlag eines Baums reduzieren:
Nachdem dies gepostet wurde, kommentierte OP das Zulassen von "nativen Polynomen". Hier ist also eine 25-Byte-Lösung, die das Polynom als Eingabe akzeptiert. Dies funktioniert, weil Mathematica standardmäßig Polynome über die ganzen Zahlen faktorisiert und alle rationalen Wurzeln in einer
m*x+b
solchen Form angezeigt werden, bei der die Musterübereinstimmung fehlschlägt.Wie @alephalpha betont hat, schlägt dies für den Fall fehl, in dem Null eine Wurzel ist, um zu beheben, dass wir das
Optional
Symbol verwenden können:
Dies analysiert Mathematica 11.0.1, schlägt jedoch fehl und erfordert einen zusätzlichen Satz von Klammern
b_:0
in Version 11.2. Dies beansprucht bis zu 27 Bytes plus zwei weitere nach Version 11.0.1. Es sieht aus wie ein „fix“ wurde in setzen hierProbieren Sie es online!
quelle
#.#
anstelle von verwendenTr@Abs@#
: Es ist eine schlechtere Grenze, aber weniger Bytes.Wolfram Language (Mathematica) ,
332631 BytesEs wurde ein Fehler behoben, der von Kelly Lowder in den Kommentaren vermerkt wurde.
Probieren Sie es online!
Vorherige falsche Lösungen:
Mir ist gerade aufgefallen, dass für keine ganzzahlige Lösung die Ausgabe undefiniert anstelle einer leeren Liste ist. Dadurch können einige Bytes entfernt werden.
Probieren Sie es online!
Wenn jetzt keine ganzzahlige Lösung existiert, kehrt die Funktion zurück
x
.Vorher:
Probieren Sie es online!
quelle
Union
das beheben.Solve
: Die Liste der Variablen kann weggelassen werden.R ,
6159 BytesEin besonderes Dankeschön an @mathmandan für den Hinweis auf meine (falsche) Herangehensweise könnte gerettet und gespielt werden!
Probieren Sie es online!
Nimmt die Eingabe als Liste von Koeffizienten in aufsteigender Reihenfolge, dh
c(-1,0,1)
repräsentiert-1+0x+1x^2
.Unter Verwendung des rationalen Wurzelsatzes funktioniert der folgende Ansatz für 47 Bytes beinahe:
Probieren Sie es online!
-p:p
generiert einen symmetrischen Bereich (mit einer Warnung), indem nur das erste Element vonp
, verwendet wirda_0
. Nach dem Rational Root Theorem müssen alle rationalen Wurzeln vonP
die Form haben,p/q
in der sichp
dividierta_0
undq
dividierta_n
(plus oder minus). Daher ist die Verwendung von justa_0
für|a_0|>0
, wie für alleq
, ausreichend|p/q|<=a_0
. Wenna_0==0
sich jedoch wie damals eine ganze Zahl teilt0
, schlägt dies fehl.Mathmandan weist jedoch darauf hin, dass in diesem Fall tatsächlich ein konstanter Faktor herausgerechnet werden
x^k
kann, und unter der Annahme, dass erk
maximal ist, sehen wir diesWir wenden dann den Satz der rationalen Wurzel an
Q(x)
und liefern , wiea_k
durch die Maximalität von garantiert istk
,a_k
eine aufgeräumte Grenze für die ganzzahligen Wurzeln vonQ
, und die Wurzeln vonP
sind die Wurzeln vonQ
zusammen mit Null, so dass wir die ganze ganze ganze Zahl haben Wurzeln vonP
durch diese Methode anwenden.Dies ist äquivalent dazu, den ersten Koeffizienten des Polynoms zu finden, der nicht Null ist,
t=p[!!p][1]
und ihn anstelle des Naivenp[1]
als Grenze zu verwenden. Da der Bereich-t:t
immer Null enthält, würde die AnwendungP
auf diesen Bereich immer noch Null als Wurzel ergeben, wenn dies tatsächlich der Fall ist.ungolfed:
quelle
max
die absoluten Werte anstelle von verwendensum
; dies würde die Byteanzahl nicht ändern, sollte aber die Leistung verbessern.) Wie auch immer, schade, dass die kürzere Version nicht funktionierta_0==0
. Gibt es in R eine kurze Möglichkeit, nach dem ersten Koeffizienten (mit aufsteigender Potenz) ungleich Null zu suchen und diesen stattdessen zu verwenden? Dies würde bedeuten, zuerst so viele x wie möglich herauszurechnen (natürlich müsste man dann daran denken, auch auszugeben0
, was vermutlich einige Bytes kosten würde.)max
wäre effizienter, aber zu Ihrem zweiten Punkt, da ich mich nicht um die Ausgabe kümmern muss,0
da sie durch den Bereich generiert wird-t:t
(wot
der erste Koeffizient ungleich Null ist), werden 2 Bytes gespart!Gelee , 8 Bytes
Probieren Sie es online! oder als Testsuite!
Wie?
Basierend auf Luis 'Antwort . Eine Alternative .
quelle
Ær+.Ḟ
?[1,2,3]
.[10,-42,8]
, nicht wahr?Oktave ,
5949 BytesProbieren Sie es online!
Dies ist ein Port meiner R-Antwort . Der einzige Unterschied besteht darin, dass ich den Bereich explizit verwenden
sign(t)
undend
generieren muss und dasspolyval
das Polynom berechnet werden muss.Nimmt die Eingabe als Zeilenvektor von Koeffizienten in absteigender Reihenfolge.
quelle
Pari / GP , 31 Bytes
Faktorisiert das Polynom und wählt die Faktoren aus, deren Ableitungen 1 sind.
Probieren Sie es online!
quelle
C (gcc) ,
127126123 Bytesl+~j++
zul-++j
.Probieren Sie es online!
Erläuterung
C (gcc) , 517 Bytes
Probieren Sie es online!
quelle
l+~j++
kann golfen werdenl-++j
Java 8,
141140 BytesInspiriert von @Rods Python 2-Antwort (seine 82-Byte-Version) .
Eine lustige Herausforderung! Ich habe sicherlich viel gelernt, als ich Polynome untersuchte und sah, wie es einige andere hier getan haben.
Erläuterung:
Probieren Sie es online aus.
quelle
Oktave mit Symbolpaket, 63 Bytes
Probieren Sie es online!
quelle
05AB1E , 8 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 97 Byte
Nimmt Koeffizienten in absteigender Reihenfolge der Leistung und gibt sie in absteigender Reihenfolge aus.
quelle
Sauber ,
11091 BytesProbieren Sie es online!
quelle
Python 2 , 89 Bytes
Probieren Sie es online!
quelle