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 -s
Flag 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. $2
Wenn 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 x
das ein Leerzeichen folgt, dh dem x
des 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 1
Koeffizienten ü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 1
auf ein \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Der erste Fall hat eigentlich nichts mit den anderen zu tun, also halten wir ihn getrennt.