Ich liebe das Programmieren und kenne jede Sprache, aber ich mag Mathe. Leider verlangt meine Schule, dass Computer-Studenten ein Jahr Rechenzeit benötigen. Nächste Woche gibt es einen Test und ich kenne keine der Formeln für Derivate!
Bitte helfen Sie mir, die Formeln zu finden. Ich benötige ein Spickzettel - ein Programm (so kurz wie möglich, damit mein Lehrer es nicht bemerkt), das einen Ausdruck (wie 4*x^3-2
) als Eingabe verwendet und die Ableitung ausgibt. (Es ist mir egal, ob die Eingabe und Ausgabe Befehlszeilenargumente, STDIN, STDOUT oder was auch immer verwendet, da ich die gesamte Berechnung sowieso in meinem Kopf mache.)
Der Test deckt die folgenden Arten von Funktionen ab:
- Konstanten, wie
-3
oder8.5
- Power-Funktionen, wie
x^0.5
oderx^-7
- Exponentialfunktionen, wie
0.5^x
oder7^x
(die Basis ist immer positiv) - Eine Konstante multipliziert mit einer Funktion wie
3*x^5
oder-0.1*0.3^x
- Die Summe und Differenz mehrerer Funktionen, wie z
-5*x^2+10-3^x
Mein Lehrer formatiert seine Fragen immer genauso wie oben gezeigt. Er verwendet auch keine Brüche, Zahlen wie pi oder e oder wirklich große Zahlen (größer als 1.000). Er verwendet niemals Klammern und zeigt die Multiplikation immer mit einem Sternchen ( *
) an. Die einzige verwendete Variable ist immer x .
Andererseits ist mein Lehrer bei Antworten ziemlich nachsichtig. Sie müssen überhaupt nicht vereinfacht oder genau wie oben dargestellt formatiert werden, solange klar ist, was die Antwort sagt.
Ich kann zwar jede Sprache verwenden, denke aber daran, dass ich selbst keine Ableitungen finden kann. Wenn das Programm also integrierte Funktionen verwendet, um mit Gleichungen umzugehen oder Ableitungen zu berechnen, kann ich sie nicht verwenden.
Während des Tests habe ich keinen Zugriff auf das Internet oder andere Dateien als das Programm auf dem Spickzettel.
Hinweis: Dieses Szenario ist vollständig fiktiv. Im wirklichen Leben ist das Betrügen und Helfen anderer falsch und sollte niemals getan werden.
x
immer die Variable zu unterscheiden ist?Antworten:
Wolfram
136134109 [Danke an Calle für seinen Kommentar unten]Eingeschränkte Unterstützung für Produkt- und Kettenregeln.
Beispiel:
Beachten Sie, dass hierbei keine "integrierten Funktionen zum Behandeln von Gleichungen oder zum Berechnen von Ableitungen" verwendet werden: Es handelt sich nur um eine Mustererkennung *.
[* Nun ... technisch gesehen parst und erstellt der Interpreter auch eine Art AST aus den Eingaben]
Ungolfed:
quelle
Power
,Times
usw. IDK, um wie viel dies Ihre Golfversion verbessert, aber Sie haben mindestens eine,Times
damit Sie def. Speichern Sie einige Zeichen. Beachten Sie auch, dass in Ihrer ungolfed Version stehtd[expr_]:= v/...
.Perl - 121
122(+2 für
-p
)Prüfung:
quelle
Haskell 38 Zeichen
Die Funktion
d
übernimmt eine Funktion und gibt eine Funktion zurück. Es wird in Form einer Potenzreihe eingegeben und auf die gleiche Weise ausgegeben (was eine Art von allem ist).Wenn wir zum Beispiel eingeben
x->x^2
, erhalten wirx->2*x
.Und für die Exponentialfunktion.
quelle
2^x
?4*x^3-2
) als Eingabe nimmt", wie vom OP gefordert.Prolog 176
Unterstützte Operatoren: binär
+
, binär-
, binär*
, binär^
, unär-
. Beachten Sie, dass Unary+
nicht unterstützt wird.Probelauf:
Prolog ist verwirrt, wenn es in
^-
Sequenz läuft . Ein Raum ist zwischen eingefügt werden^
und-
für die es zu analysieren , um die Expression korrekt.Ich hoffe, Ihr Lehrer hat nichts dagegen, die Gleichung durcheinander zu bringen.
Verrückte Zeit:
quelle
C 260
Hey, ich glaube ich kenne deinen Lehrer! Ist es nicht jemand, der die übernatürliche Fähigkeit besitzt, Schüler zu entdecken, die Bibliotheksmuster-Abgleichfunktionen in ihrem Kopf ausführen?
Also, Verwendung
sscanf
kommt nicht in Frage ... Aber keine Sorge:Laufende Beispiele (Eingabe ein
stdin
; Ausgabe geht anstdout
):Dieses Format ist viel besser als nur
12*x^2
, denn auf diese Weise kann Ihr Lehrer sicher sein, dass Sie die Antwort selbst berechnet und nicht durch Kopieren von jemand anderem betrogen haben!Die Ausgabe weist ein leichtes Domainproblem auf
x=0
, ist aber fast überall korrekt !Als Referenz ist hier eine ungolfed, lesbare (von bloßen Sterblichen) Version. Es verwendet eine Zustandsmaschine mit 5 Zuständen und 5 Kategorien von Eingabezeichen.
PS Achten Sie auf diese
gets
Funktion: Sie weist eine Sicherheitslücke auf, durch die Ihr Lehrer ein Rootkit in Ihrem Kopf ausführen kann, indem er zu lange Eingaben macht ...quelle
Lua
296268263Nicht sehr golfed und kann derzeit nicht mehrere Begriffe behandeln (man kann es nur ein paar Mal läuft, nicht wahr?), Aber es kann behandeln
n^x
,x^n
undn
als Eingabe.Ungolfed ...
quelle
str.func(str,...)
==str:func(...)
, deswegen haben die Strings doch das Metatable bekommen ...l
local zu deklarieren . Erwarten Sie einfach, dass die Eingabe in gespeichert wird,a
und sagen Sie, dass die Ausgabe in gespeichert wirdl
.a:find("x")
Beachten Sie auch, dass dies1then
nur in Lua 5.2()
ist optional. Das1then
Problem wurde behoben, da ich nicht über 5.2 verfüge (keine CPU-Updates durchführen, bis die Dissertation abgeschlossen ist, da ich nichts vermasseln möchte).ECMAScript 6, 127 Bytes
Hier ist mein Regex-Versuch (unter Verwendung eines einzelnen Regex und einer Logik im Ersetzungs-Callback):
Dies erwartet, dass die Eingabezeichenfolge in gespeichert wird,
i
und gibt einfach das Ergebnis zurück. Probieren Sie es in einer ECMAScript 6-kompatiblen Konsole (wie Firefox) aus.quelle
sed, 110
Ganz wörtlich: "Sie müssen überhaupt nicht vereinfacht oder genau wie oben dargestellt formatiert werden, solange klar ist, was in der Antwort steht."
Die Byteanzahl enthält 1 für das
r
Flag.Ungolfed, mit Kommentaren:
Probelauf:
Ich wette, das könnte weiter golfen werden. es ist mein erster versuch an
sed
. Spaß!quelle
Rubin, 152
... oder 150, wenn Sie nicht drucken müssen ... oder 147, wenn Sie auch mit einem Array einverstanden sind, das Sie selbst verbinden müssen.
renn mit
ruby -nal
ungolfed:
Mein Hauptproblem bei diesem ist die Anzahl der Zeichen, die für die richtige Aufteilung benötigt werden. Der einzige andere Weg, den ich mir vorstellen konnte, war,
split(/(?<!\^)([-+])/)
was gibt+
und-
was ihre eigenen Ergebnisse sind. Irgendwelche Tipps für eine bessere Lösung?Gibt es auch einen kürzeren Weg, um zurückzukehren,
s
wenn es nicht leer ist, aber ansonsten zurückzukehreny
? Habe ich benutzts[0]?y:s
? In JS würde ich nur tuns||y
, aber""
in Ruby ist es wahr.quelle
split(/(?<!\^)(?=[-+])/)
?