Symbolische Unterscheidung 1: Coefishin gegangen
Aufgabe
Schreiben Sie ein Programm, das ein Polynom in x von stdin (1 <deg (p) <128) aufnimmt und es differenziert. Das Eingabepolynom ist eine Zeichenfolge der folgenden Form:
"a + bx + cx^2 + dx^3 +" ...
wobei der Koeffizient jedes Terms eine ganze Zahl ist (-128 <a <128). Jeder Term ist durch ein Leerzeichen, ein + und ein anderes Leerzeichen getrennt. lineare und konstante Terme erscheinen wie oben (dh nein x^0
oder x^1
). Die Terme werden in aufsteigender Reihenfolge angezeigt, und die Potenzen mit dem Koeffizienten Null werden weggelassen. Alle Terme mit dem Koeffizienten 1 oder -1 zeigen diesen Koeffizienten explizit an.
Ihre Ausgabe muss genau die gleiche Form haben. Beachten Sie, dass die Koeffizienten in der Ausgabe möglicherweise 127 * 127 == 16129 betragen.
Beispiele
"3 + 1x + 2x^2" ==> "1 + 4x"
"1 + 2x + -3x^2 + 17x^17 + -1x^107" ==> "2 + -6x + 289x^16 + -107x^106"
"17x + 1x^2" ==> "17 + 2x"
Wertung
Ihre Punktzahl ist die Länge Ihres Programms in Bytes, multipliziert mit drei, wenn Sie eine eingebaute oder eine Bibliothek verwenden, die symbolische Algebra ausführt.
Antworten:
Retina ,
534342414035 BytesZu 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
anstatt
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: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.Dies entspricht einem, auf
x
das ein Leerzeichen folgt, dh demx
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.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.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 zusammenfassenJetzt 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 kann1
auf ein\w
:Der erste Fall hat eigentlich nichts mit den anderen zu tun, also halten wir ihn getrennt.
quelle
CJam,
4341 BytesVielen Dank an @ jimmy23013 für den Hinweis auf einen Fehler und das Abwerfen von zwei Bytes!
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Perl,
6463 Bytes62b Code + 1 Befehlszeile (-p)
Im Moment nicht erstaunlich, aber ich werde weiterhin versuchen, es zu verkürzen.
Anwendungsbeispiel:
Danke Denis für -1b
quelle
Julia, 220 Bytes
Keine regulären Ausdrücke!
Dadurch wird eine Lambda-Funktion erstellt, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Die Innereien ahmen nach, was passiert, wenn Julia-Code ausgewertet wird: Eine Zeichenfolge wird in Symbole, Ausdrücke und Aufrufe zerlegt. Ich könnte tatsächlich versuchen, eine vollständige symbolische Julia-Differenzierungsfunktion zu schreiben und sie als Teil von Julia einzureichen.
Ungolfed + Erklärung:
quelle
C,
204, 162 BytesAnalysieren Sie grundsätzlich jeden Begriff und drucken Sie den differenzierten Begriff nacheinander aus. Ziemliech direkt.
quelle
JavaScript ES6, 108 Bytes
ES5-Snippet:
quelle
Python 2, 166 Bytes
Junge, das scheint länger zu dauern, als es sein sollte.
Die Funktion
d
nimmt einen nicht konstanten Term ant
und gibt dessen Ableitung zurück. Der Grund, warum ichdef
die Funktion anstelle eines Lambdas verwende, ist, dass ich den Exponenten minus 1 zuweisen kanne
, der dann noch viermal verwendet wird. Das nervigste ist, zwischen Strings und Ints hin und her zu wechseln, obwohl der Backtick-Operator von Python 2 dabei hilft.Wir teilen dann den Eingang in Terme auf und rufen
d
jeden auf, der"x"
darin ist, wodurch der konstante Term beseitigt wird. Die Ergebnisse werden wieder zusammengefügt und ausgedruckt.quelle
CJam,
62575549 BytesNun, Dennis hat das beschämt, bevor ich überhaupt bemerkte, dass die Seite wieder online war. Aber hier ist trotzdem meine Schöpfung:
Die neueste Version spart ein paar Bytes mit von @Dennis vorgeschlagenen Verknüpfungen (verwenden Sie Variablen und teilen Sie stattdessen nach Leerzeichen auf)
+
).Probieren Sie es online aus
quelle
_({'^a\}{;}?
ist 1 Byte länger als:T({T'^a\}&
.~
Block else nicht und können diesen auch entfernen.x
. Während ich dabei war, habe ich weitere Verbesserungen gefunden. Da ich die Werte jetzt in Variablen habe, kann ich sie meistens dort abrufen, wo ich sie wirklich brauche, was einige Stapelmanipulationen erspart. Ich hatte auch einen Streunera
, der hätte gelöscht werden müssen, als ich die Ausgabegenerierung früher optimiert hatte.Pyth, 62 Bytes
Ziemlich hässliche Lösung mit einigen Regex-Substitutionen.
quelle
Python 3, 176 Bytes
In der Tat ist die Hauptstörung, zwischen Zeichenfolgen und Ints konvertieren zu müssen. Wenn ein konstanter Term erforderlich wäre, wäre der Code nur 153 Byte groß.
quelle
Python 2, 229 Bytes
quelle
Python 2, 174 Bytes
Leider verkürzt DLoscs Trick, die Aufteilungsmethode umzubenennen und die Unterscheidung in einer bestimmten Funktion vorzunehmen, meinen Code nicht ...
quelle