Einführung
Menschen sind eine bemerkenswerte Spezies, aber manchmal ist es sehr umständlich, sie zu verstehen - besonders für Computer. Insbesondere scheinen wir es zu mögen, Polynome auf sehr verschlungene Weise mit scheinbar willkürlichen Regeln zu schreiben.
Was ist das kürzeste Programm, das Sie schreiben können, um ein Polynom nach diesen Regeln korrekt zu formatieren?
Herausforderung
Eingang
Eine Liste von ganzen Zahlen zwischen -1000 und 1000 (einschließlich), die die Koeffizienten eines Polynoms darstellen, wobei der letzte Eintrag der Koeffizient von x ^ 0 (die Konstante) ist, der vorletzte der Koeffizient von x ^ 1 usw.
Ausgabe
Ein String, der dieses Polynom in der korrekt formatierten mathematischen Notation des Menschen darstellt.
Regeln:
- Das Vorzeichen des Leitkoeffizienten wird nur angezeigt, wenn es negativ ist.
Right: -x^2+3
Wrong: +x^2+3
- Komponenten mit dem Koeffizienten 0 werden nicht gedruckt (mit Ausnahme des Eckfalles, bei dem alle Koeffizienten 0 * sind).
Right: x^5-x^2+3
Wrong: x^5+0x^4+0x^3-x^2+0x+3
- Koeffizienten
-1
und+1
sollen ohne die 1 angezeigt werden, es sei denn, sie sind die Konstante.
Right: x^5-x^2+1
Wrong: 1x^5-1x^2+1
- Der Exponent wird nur angezeigt, wenn er größer als 1 ist, und die Variable wird nur angezeigt, wenn der Exponent größer als 0 ist.
Right: 3x^3-7x^2+2x+1
Wrong: 3x^3-7x^2+2x^1+1x^0
- * Eckfall: Während Nullwerte normalerweise dazu führen, dass diese Komponente nicht gedruckt wird, sollte die Konstante 0 gedruckt werden, wenn alle Koeffizienten Null sind.
Right: 0
Wrong: 0x+0
Wrong: (nothing)
- Dies ist Code-Golf, also wird der Gewinner das Programm mit den wenigsten Bytes sein.
Beispiel für Ein- und Ausgabe
Input: Output:
[0] 0
[0,0] 0
[0,-1,35,0] -x^2+35x
[5,1,7,-9] 5x^3+x^2+7x-9
[100,0,0,-1] 100x^3-1
[931,21,-11,1] 931x^3+21x^2-11x+1
Ich freue mich auf Ihre Lösungen. Habe Spaß!
BEARBEITEN:
- Sie können Operationen mit Leerzeichen umgeben, wenn Sie dies wünschen. Also
3x+5
und3x + 5
beiden geht es gut.3x+ 5
und3x +5
sind es nicht. - Wenn Sie tatsächliche Exponentenzeichen (z. B. in Tex) erzeugen möchten, ist dies zulässig, da dies noch näher an der Schreibweise der Menschen liegt.
- Koeffizienten müssen ohne Dezimalstellen angegeben werden, z. B.
9x^2
ist richtig,9.0x^2
nicht.
quelle
3x^2 + 4
gegen3x^2+4
?1x
->x
Ersatz ändert sich nicht21x^2
in2x^2
.Antworten:
Retina 0,8,2 , 56 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Fügen Sie alle Befugnisse von ein
x
, einschließlich,x^1
aber nichtx^0
.Löschen Sie alle Potenzen von
x
mit Null-Koeffizienten, aber0
(noch) nicht mit einem Trailing .Löschen Sie einen Multiplikator von
1
(aber keine Konstante1
).Löschen Sie die
^1
vonx^1
.Löschen Sie eine Konstante 0, es sei denn, es ist das einzige, was noch übrig ist.
Löschen Sie das Leerzeichen vor a
-
.Ändern Sie alle verbleibenden Leerzeichen in
+
s.quelle
JavaScript (ES6),
107106 BytesProbieren Sie es online!
Wie?
Die Ausgabe wird erstellt, indem die folgenden Formeln auf jeden Koeffizienten c des Eingabearrays a [] angewendet werden, während der aktuelle Exponent e verfolgt wird .
1. Formel: Pluszeichen
Wenn der Koeffizient streng positiv ist und dies nicht der erste Term im Ausgabeausdruck ist, fügen wir a hinzu
+
. Ansonsten hängen wir nichts an.2. Formel: Minuszeichen und Koeffizient
Wenn der Exponent Null ist oder der absolute Wert des Koeffizienten ungleich 1 ist, fügen wir den Koeffizienten hinzu (der eine führende Zahl enthalten kann)
-
). Ansonsten hängen wir entweder a-
(wenn der Koeffizient negativ ist) oder nichts an.3. Formel: Variable und Exponent
Wenn der Exponent 0 ist, wird nichts angehängt. Wenn der Exponent 1 ist, hängen wir an
x
. Andernfalls wirdx^
gefolgt vom Exponenten angehängt.quelle
Stax , 37 Bytes
Führen Sie es online aus und debuggen Sie es
Hier ist die ausgepackte, ungolfierte Version.
Führen Sie dieses aus
quelle
Python 3,
279277258251 BytesÜbernimmt die Eingabe als Liste von Zeichenfolgen. Diese Lösung ist noch nicht sehr erfolgreich. Dies funktioniert im Wesentlichen, indem Dinge ersetzt werden, die dem Ausgabeformat entsprechen, wodurch die Byteanzahl stark erhöht wird.
Probieren Sie es online!
Besonderer Dank geht an ovs und NK1406 .
quelle
if'0'!=i
und zu erstellenif'-1'==i
.Pari / GP , 41 Bytes
Probieren Sie es online!
Wenn ein
*
zwischen dem Koeffizienten und der Variablen zulässig ist:Pari / GP , 3 Bytes
Probieren Sie es online!
quelle
APL (Dyalog Classic) ,
114113109107106 BytesProbieren Sie es online!
-4 Bytes danke an @dzaima!
Dies kann definitiv weiter abgespielt werden. Dafür braucht man
⎕IO←0
quelle
Pip , 78 Bytes
Nimmt die Koeffizienten als Befehlszeilenargumente. Probieren Sie es online!
Verwendet
ME
(map-enumerate) undJ
(join), um etwas vom Formular zu generieren0x^3+-1x^2+35x^1+0x^0
, und dann eine Reihe von Regex-Ersetzungen, um dies in das richtige Format umzuwandeln.quelle
APL (Dyalog Classic) ,
7976 BytesProbieren Sie es online!
quelle
Python 3,
161162 BytesEin Fehler wurde behoben, der Ovs zu verdanken war.
Erweitert:
quelle
C # , 237 Bytes
quelle
Sauber , 172 Bytes
Probieren Sie es online!
quelle
Wolfram Language / Mathematica, 39 Bytes
Probieren Sie es online!
Es hat sich herausgestellt, dass ein eingebautes Gerät in der richtigen Reihenfolge eingebaut ist.
Vorherige Lösung:
Wolfram Language / Mathematica, 93 Bytes
Zumindest für mich ist dies überraschend lang für eine Sprache, die für mathematische Manipulationen entwickelt wurde. Es scheint, alsExpand@FromDigits[#,x]&
sollte es funktionieren, aber die Standardreihenfolge für Polynome ist die Umkehrung der in der Frage geforderten Reihenfolge. Daher ist etwas zusätzliches Finagling erforderlich.Erläuterung
quelle
SringReplace
seinStringReplace
?Python3:
150 bis146 Bytes(frühere Implementierungen):
Sie können es online ausprobieren
Ein großes Lob an: @Benjamin
quelle
f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
Perl 5
-a
, 94 BytesProbieren Sie es online!
quelle
Retina 0.8.2 , 113 Bytes
Probieren Sie es online!
Ich bin mir sicher, dass es hier viel zu golfen gibt ...
quelle
Haskell ,
166163 BytesProbieren Sie es online! Anwendungsbeispiel:
g [0,-1,35,0]
Erträge"-x^2+35x"
.Vorherige 166-Byte-Lösung, die etwas besser lesbar ist:
Probieren Sie es online!
quelle
Ruby , 111 Bytes
Probieren Sie es online!
Das in Ruby zu lösen, stellte sich als etwas frustrierend heraus, hauptsächlich aufgrund der Tatsache, dass im Gegensatz zu den meisten Sprachen in Ruby (fast) alles wahr ist, einschließlich Nullen und leerer Zeichenketten, so dass selbst eine einfache Überprüfung auf Null nicht annähernd möglich ist so kurz wie
x?
.Ich spielte mit verschiedenen Methoden, um die Saite zu konstruieren, und entschied mich schließlich für eine Mischung aus mehreren Ansätzen:
+
und-
Zeichen werden durch Formatieren der Syntax mit erzwungenen Zeichen erzeugt:%+d
x^i
wird mit Hilfe der Raketenoperator-Indizierung ausgewählt[...][i<=>1]
quelle
Schale ,
44 43 4140 BytesProbieren Sie es online!
Das fühlt sich ein bisschen klobig an; Husk ist nicht für die Manipulation von Saiten optimiert. Ich habe einige Ideen aus der Stax-Antwort entlehnt .
Erläuterung
quelle
Perl 6 , 97 Bytes
Probieren Sie es online!
Erläuterung:
$!
Verfolgt den aktuellen Exponenten.Addiere
+
vor positiven Koeffizienten, außer wenn es der erste ist, der nicht Null ist. Der$_&&
Kurzschluss stellt sicher, dass die anonyme Zustandsvariable$
nur für Nicht-Null-Koeffizienten inkrementiert wird. Die&
Kreuzung wird reduziert, wenn sie mit Bool zusammengedrückt wird?
.Dekrement
$!
. Zerhacken Sie den Koeffizienten 1 oder -1, sofern er nicht konstant ist.Sonderfall lineare und konstante Terme. Die Verwendung des Anführungszeichen-Schutzkonstrukts
<< >>
ist ein Byte kürzer als das entsprechende('','x')
oder2>$!??'x'x$!!!'x^'~$!
.Blenden Sie keine Terme aus, aber werten Sie den vorhergehenden Ausdruck immer auf die
--$!
Nebenwirkung aus.Rückgabe,
0
wenn alle Koeffizienten Null sind.quelle
Java 8,
202176174173 BytesErläuterung:
Probieren Sie es online aus.
quelle
a->{String r="";int j=a.length;for(int u:a)r+=u==(j^j--)?"":"+"+u+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
(j^j--)
zu wechselte0*j--
.Python, 165 Bytes
quelle
PHP, 213 Bytes
Befehlszeilenargument wie von OP angefordert (einzelnes Argument mit Klammern und Kommas).
Schöner Druck und eine Erklärung:
quelle
PowerShell, 295 Byte
quelle