Einführung
Schreiben Sie ein Programm, um die partielle Ableitung eines Polynoms (möglicherweise multivariat) in Bezug auf eine Variable zu berechnen.
Herausforderung
Derivate sind sehr wichtige mathematische Werkzeuge, die in der Physik, Chemie, Biologie, Wirtschaft, Psychologie und anderen Bereichen weit verbreitet sind, um alle Arten von Problemen zu lösen. Ausdrücke mit mehreren Variablen sind ebenfalls sehr häufig.
Im Rahmen dieser Herausforderung wird eine Polynomzeichenfolge ("polystr") durch die folgende BNF (Backus-Naur-Form) definiert:
<polystr> ::= <term> | <term><plusminus><polystr>
<plusminus> ::= "+" | "-"
<term> ::= <coeff> | <coeff><baseterm> | <baseterm>
<baseterm> ::= <variable> | <variable><exponent> | <baseterm><baseterm>
<coeff> ::= positive_integer
<exponent> ::= positive_integer
<variable> ::= lowercase_ASCII_letters
Wo positive_integer
und lowercase_ASCII_letters
sind ganz selbsterklärend.
Zum Beispiel 3x2y-x3y-x2y+5
bedeutet die Zeichenfolge 3*(x^2)*y-(x^3)*y-(x^2)*y+5
. Die in der Eingabe angegebenen Begriffe können in beliebiger Reihenfolge angezeigt werden, und die Variablen in jedem Begriff können auch in beliebiger Reihenfolge angezeigt werden. So ist zum Beispiel 5-yx2-x3y+y3x2
auch eine gültige Eingabe und ist in der Tat die gleiche wie im vorherigen Beispiel.
Die Regel für die partielle Ableitung lautet, dies nur Begriff für Begriff zu tun. Wenn die Variable nicht im Term erscheint, ist die Ableitung Null. Andernfalls wird der Koeffizient des Terms mit dem Exponenten dieser Variablen multipliziert, und dann wird der Exponent der Variablen um eins verringert. Die Exponenten für andere Variablen ändern sich nicht. Dies folgt nur der Definition in der Mathematik. Wenn der resultierende Exponent Null ist, entfernen Sie außerdem die Variable aus dem Term.
Zum Beispiel, um die partielle Ableitung von 5z-z2y2-5w3y
in Bezug auf zu nehmen y
. Der folgende Vorgang wird durchgeführt (gemäß dem oben definierten BNF werden die "Koeffizienten" alle als positive Zahlen angenommen, dh die Vorzeichen werden separat betrachtet)
5z - z2y2 - 5w3y
Coeff 1->1*2=2 5->5*1=5
Expon 2->2-1=1 1->1-1=0
Term - 2yz2 - 5w3
(y is not here (expon 0->y removed)
so the term is 0)
Das Ergebnis ist -2yz2-5w3y
.
Wenn andererseits der obige Ausdruck in Bezug auf teilweise abgeleitet wird a
, ist das Ergebnis, 0
weil er a
in keinem der Begriffe enthalten ist.
Ihre Aufgabe ist es, eine Funktion oder ein vollständiges Programm zu schreiben, um diese Ableitung zu berechnen. Es sollte eine Polynomzeichenfolge und ein einzelnes Zeichen (die Variable, für die eine Ableitung vorgenommen werden soll) annehmen und die Ableitung in der einfachsten Form zurückgeben.
"Einfachste Form" bedeutet drei Dinge.
Die Zahl
0
(nicht die Ziffer) sollte nicht in der Ausgabe erscheinen, es sei denn, die Ausgabe selbst ist gerecht0
. Also weder0+10y
noch3-y0z
gültig ausgegeben werden und sollte umgewandelt werden10y
und3-z
sind.Die Zahl
1
sollte nicht als Exponent oder Koeffizient erscheinen, sondern kann selbst als eigenständiger Begriff erscheinen.Die Begriffe mit genau demselben Satz von Variablen und Exponenten sollten zusammengeführt werden, was bedeutet, dass dies
3a2b5-4b5a2
keine gültige Ausgabe ist und-a2b5
stattdessen erfolgen sollte. Weitere Informationen zur Ein- und Ausgabe finden Sie im Abschnitt "Technische Daten".
Testfälle
Input
Output
2xy+4ax-5+7mx4-4-7x4m, x
2y+4a
4upv+5u2v3w4-4w4u2v3+qr-v,v
4up+3u2v2w4-1
12ux-7x2m3+ab5,q
0
-a+10ca11y-1nv3rt3d-poly, a
-1+110ca10y
1y+1x3y, y
1+x3
Technische Daten
- Die Eingabe kann über Standardformulare erfolgen . Mit anderen Worten, Sie können Eingaben als Zeichenfolge, als Liste von Zeichen, als verschachteltes Array von Koeffizienten, Variablen (möglicherweise gekennzeichnet durch ihren ASCII-Wert minus 'a' oder ähnliches) und Exponenten usw. verwenden. Sie können auch Änderungen vornehmen die Saite zu
2*x^3y^2
oder gleich statt2x3y2
.
Verwenden Sie jedoch nicht die Eingabe [2,0,0,0,1,0,0,3,0,0,...0]
(ein Array mit 27 Elementen) für den Begriff 2dg
oder ein anderes ausführliches Format, das die 26 Buchstaben wie folgt auflistet. Ihr Eingabeformat sollte auch in der Lage sein , zu behandeln , ab
und ba
als verschiedene Eingänge (so dass das 27-Element - Array - Format aufgrund dieser Beschränkung ungültig ist als auch).
Jede Variable (Buchstabe) wird in jedem Term der Eingabe nur einmal angezeigt. Das bedeutet, dass
xx
sie nicht angezeigt wird und immer als dargestellt wird, und dass auch nichtsx2
Ähnlichesa3b4a2
angezeigt wird.Zur Wiederholung können die Begriffe in der Eingabe in beliebiger Reihenfolge angezeigt werden.
Sie können auch das Ausgabeformat frei wählen, sofern das oben erwähnte ausführliche Format vermieden wird. Die Ausgabe sollte jedoch immer in der einfachsten Form wie oben definiert sein. Genau wie bei der Eingabe können die Begriffe in der Ausgabe in beliebiger Reihenfolge angezeigt werden, und die Variablen in jedem Begriff können auch in beliebiger Reihenfolge angezeigt werden und müssen nicht zwischen den Begriffen konsistent sein. Das heißt, es
pu+2up2
ist eine gültige Ausgabe. Das Vorzeichen für den führenden Begriff kann entweder positiv oder negativ sein-y+3x
und3x-y
ist beide gültig+3x-y
.Die Eingabe wird immer so angegeben, dass alle Koeffizienten und Exponenten in der Ausgabe kleiner als 2 32 -1 sind oder die größte Ganzzahl, die Ihre Sprache verarbeiten kann, je nachdem, welcher Wert kleiner ist. Die Behauptung, dass die größte Ganzzahl, die Ihre Sprache verarbeiten kann, unangemessen klein ist und die Trivialisierung der Herausforderung in die Kategorie der Standardschlupflöcher fällt.
Dies ist Code-Golf , die niedrigste Anzahl von Bytes gewinnt.
Wie üblich gelten hier Standardlücken .
Bearbeiten: Da sich die meisten Antworten bisher als Interna herausstellen, die die ganze Herausforderung bewältigen, und obwohl ich weiß, dass es eingebaute Funktionen gibt, habe ich nicht die Absicht, solche Interna von Anfang an zu verbieten, und ich habe es jetzt auch nicht getan. Ich werde die Gewinnkriterien zu einem Kriterium machen, das auf einer sprachbasierten Basis basiert, dh die Einreichung mit den geringsten Bytes in jeder Sprache gewinnt in dieser Sprache. Ich werde ein Standard-Snippet für einen Katalog hinzufügen, wenn genügend Einreichungen vorhanden sind. Sie können weiterhin eingebaute Antworten einreichen, um die Leistungsfähigkeit Ihrer Sprache zu demonstrieren. Zögern Sie jedoch nicht, Ihre nicht eingebauten Antworten einzureichen, auch wenn diese viel länger sind und Ihre Sprache keine eingebauten Antworten enthält. Viel Spaß beim Code-Golfen in Ihrer Lieblingssprache!
quelle
-9
in Ihrem ersten Beispiel in der Ausgabe angezeigt?take derivative
undmerge
no exponent 1
, obwohl Sie dies nicht zu sagen scheinenAntworten:
Python 2 ,
252245 BytesProbieren Sie es online aus!
Nimmt die Eingabe als verschachtelte Liste von Koeffizienten und Begriffen auf:
Zum Beispiel wird das erste Beispiel (
5z-z2y2-5w3y
) wie folgt angegeben:Die Fußzeile enthält eine Funktion, die eine Zeichenfolgeneingabe im gewünschten Eingabeformat analysiert :
parse(s)
.Bearbeiten:
quelle
Retina ,
249233 BytesProbieren Sie es online aus! Link enthält Testfälle. Erläuterung:
Fügen Sie
_
nach jedem Auftreten der angegebenen Variablen ein hinzu.Teilen Sie die Eingabe in Begriffe auf.
Behalten Sie nur die Begriffe bei, die auf die Variable verwiesen haben.
Präfix a,
+
wenn der erste Begriff kein Vorzeichen hat.Sortieren Sie jeden Begriff alphabetisch. (Das Schild stimmt überein, aber das ist kein Problem; es sortiert sowieso am Anfang.)
Konvertieren Sie alle Exponenten der Variablen in unär.
Stellen Sie diesen Begriffen vorübergehend 1 ohne Multiplikator voran.
Multiplizieren Sie den Multiplikator mit dem Exponenten der Variablen und lassen Sie das Ergebnis unär.
Sortieren Sie alle Begriffe.
Fügen Sie Begriffe mit demselben Zeichen hinzu.
Subtrahieren Sie Begriffe mit unterschiedlichen Vorzeichen.
Entfernen Sie Begriffe, die durch einen Begriff mit einem anderen Zeichen storniert wurden.
Konvertieren Sie den Multiplikator zurück in eine Dezimalzahl.
Dekrementieren Sie Exponenten größer als drei und konvertieren Sie sie zurück in Dezimalzahlen.
a) Entfernen Sie ein führendes
+
Vorzeichen. b) Verbinden Sie alle Begriffe wieder miteinander. c) Konvertieren Sie die Quadrate der Variablen in die einfache Variable. d) Entfernen Sie die Variable, wenn sie keinen Exponenten hat.Entfernen Sie die temporäre 1, es sei denn, sie muss nicht mehr multipliziert werden.
Wenn keine Begriffe mehr vorhanden sind, ist das Ergebnis Null.
Die Unterstützung doppelter Begriffe kostet fast die Hälfte meiner Byteanzahl. Vorherige 123-Byte-Lösung, bei der Begriffe nicht dedupliziert wurden:
Probieren Sie es online aus! Erläuterung:
Fügen Sie
_
nach jedem Auftreten der angegebenen Variablen ein hinzu.Teilen Sie die Eingabe in Begriffe auf.
Behalten Sie nur die Begriffe bei, die auf die Variable verwiesen haben.
Konvertieren Sie alle Exponenten der Variablen in unär.
Stellen Sie diesen Begriffen vorübergehend 1 ohne Multiplikator voran.
Multiplizieren Sie den Multiplikator mit dem Exponenten der Variablen.
Dekrementieren Sie Exponenten größer als drei und konvertieren Sie sie zurück in Dezimalzahlen.
a) Entfernen Sie ein führendes
+
Vorzeichen. b) Verbinden Sie alle Begriffe wieder miteinander. c) Konvertieren Sie die Quadrate der Variablen in die einfache Variable. d) Entfernen Sie die Variable, wenn sie keinen Exponenten hat.Entfernen Sie die temporäre 1, es sei denn, sie muss nicht mehr multipliziert werden.
Wenn keine Begriffe mehr vorhanden sind, ist das Ergebnis Null.
quelle
Wolfram Language (Mathematica) ,
21 bis20 Byte-1 Byte danke an Jonathan Frech !
Probieren Sie es online aus!
Die Eingabe ist so formatiert, dass jeder Begriff folgt
coeff * var1 ^ exp1 * var2 ^ exp2 ...
. Wenn die Eingabe als Ausdruck und nicht als Zeichenfolge verwendet werden kann, lautet die Lösung 1 Byte :D
.quelle
#1
kann sein#
.Physica , 3 Bytes
Dies verwendet keine neue Funktion.
∂
und seine reine ASCII-AlternativeDifferentiate
wurden vor mehr als 10 Tagen eingeführt .Demo
Angenommen, sowohl der Ausdruck als auch die Variable werden als Zeichenfolge übergeben. Testcode:
Genaue Ausgabe:
Ausdrucksformat:
*
zur Multiplikation,**
zur Exponentiation+
und-
zur entsprechenden Addition und Subtraktion.quelle
Python 3 + SymPy , 23 Bytes
Probieren Sie es online aus!
quelle
Pari / GP , 5 Bytes
Probieren Sie es online aus!
quelle