Retina , 53 43 42 41 40 35 Bytes
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
Zu Zählzwecken wird jede Zeile in einer separaten Datei abgelegt. Sie können die obige Datei jedoch als einzelne Datei ausführen, indem Sie Retina mit dem -sFlag aufrufen .
Dies setzt voraus, dass die Zahlen in der Eingabezeichenfolge unär sind und die Ausgabe im gleichen Format erfolgt. Z.B
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
anstatt
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
Erläuterung
Der Code beschreibt eine einzelne Regex-Ersetzung, die im Grunde 4 Ersetzungen umfasst, die zu einer komprimiert sind. Beachten Sie, dass nur einer der Zweige die Gruppe füllt. $2Wenn also einer der drei anderen übereinstimmt, wird die Übereinstimmung einfach aus der Zeichenfolge gelöscht. Wir können uns also die vier verschiedenen Fälle getrennt ansehen:
^[^x]+<space>
<empty>
Wenn es möglich ist, ein Leerzeichen vom Anfang der Zeichenfolge aus zu erreichen, ohne auf ein zu stoßen x, bedeutet dies, dass der erste Term der konstante Term ist und wir ihn löschen. Aufgrund der Gier von +wird dies auch mit dem Pluszeichen und dem zweiten Leerzeichen nach dem konstanten Term übereinstimmen. Wenn es keinen konstanten Term gibt, wird dieser Teil einfach niemals übereinstimmen.
x(?= )
<empty>
Dies entspricht einem, auf xdas ein Leerzeichen folgt, dh dem xdes linearen Terms (falls vorhanden), und entfernt es. Wir können sicher sein, dass dahinter ein Leerzeichen steht, da der Grad des Polynoms immer mindestens 2 ist.
1(?=1*x.(1+))
$1
Dies führt die Multiplikation des Koeffizienten mit dem Exponenten durch. Dies stimmt mit einem einzelnen 1Koeffizienten überein und ersetzt ihn durch den gesamten entsprechenden Exponenten über den Lookahead.
(\^1)?1(?= |$)
<empty>
Dies reduziert alle verbleibenden Exponenten durch Anpassung des Trailings 1(durch den Lookahead sichergestellt). Wenn es möglich ist, eine Übereinstimmung ^11(und eine Wortgrenze) zu finden, entfernen wir diese stattdessen, um den linearen Term korrekt anzuzeigen.
Bei der Komprimierung stellen wir fest, dass sich die meisten Bedingungen nicht gegenseitig beeinflussen. (\^1)?passt nicht zusammen, wenn der Lookahead im dritten Fall wahr ist, also können wir diese beiden als zusammenfassen
(\^1)?1(?=1*x.(1+)| |$)
$2
Jetzt haben wir schon den Look - Ahead für den zweiten Fall benötigt und die anderen können nicht wahr sein , wenn passend x, so dass wir einfach das verallgemeinern kann 1auf ein \w:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Der erste Fall hat eigentlich nichts mit den anderen zu tun, also halten wir ihn getrennt.