J'adore programmer et je connais toutes les langues, mais je suis nul en maths. Malheureusement, mon école exige que les étudiants en informatique prennent une année de calcul. Il y a un test la semaine prochaine et je ne connais aucune des formules pour les dérivés!
S'il vous plaît aidez-moi à trouver les formules. J'ai besoin d'un aide-mémoire - un programme (aussi court que possible pour que mon enseignant ne le remarque pas) qui prend une expression (comme 4*x^3-2
) comme entrée et génère le dérivé. (Je me moque de savoir si l'entrée et la sortie utilisent des arguments de ligne de commande, STDIN, STDOUT ou quoi que ce soit, puisque je fais tous les calculs dans ma tête, de toute façon.)
Le test couvre les types de fonctions suivants:
- Constantes, comme
-3
ou8.5
- Fonctions de puissance, comme
x^0.5
oux^-7
- Fonctions exponentielles, comme
0.5^x
ou7^x
(la base est toujours positive) - Une constante multipliée par une fonction, comme
3*x^5
ou-0.1*0.3^x
- La somme et la différence de multiples fonctions, comme
-5*x^2+10-3^x
Mon professeur formate toujours ses questions exactement de la même manière, comme indiqué ci-dessus. Il n'utilise pas non plus de fractions, de nombres tels que pi ou e , ni de très gros nombres (plus de 1 000). Il n'utilise jamais de parenthèses et affiche toujours la multiplication à l'aide d'un astérisque ( *
). La seule variable utilisée est toujours x .
D'autre part, mon professeur est assez indulgent sur les réponses. Ils n'ont pas du tout besoin d'être simplifiés ou formatés exactement comme indiqué ci-dessus, tant que la réponse est claire.
Bien que je puisse utiliser n'importe quel langage, souvenez-vous que je ne peux pas comprendre les dérivés par moi-même. Donc, si le programme utilise des fonctions intégrées pour traiter des équations ou calculer des dérivées, je ne pourrai pas l'utiliser.
Pendant le test, je n’aurai pas accès à Internet ni à d’autres fichiers que le programme sur la feuille de triche.
Remarque: Ce scénario est entièrement fictif. Dans la vraie vie, tricher et aider les autres à tricher est une erreur et ne devrait jamais être fait.
x
soit toujours la variable à différencier?Réponses:
Wolfram
136134109 [Merci à Calle pour son commentaire ci-dessous]Prise en charge limitée des règles de produit et de chaîne.
Exemple:
Notez que cela n'utilise aucune "fonction intégrée pour traiter des équations ou calculer des dérivées": seul le filtrage par motif est impliqué *.
[* Bien ... techniquement, l'interprète analyse et construit également une sorte d'AST à partir de l'entrée]
Ungolfed:
la source
Power
,Times
etc. IDK, dans quelle mesure cela améliorera votre version jouée au golf, mais vous en avez au moins unTimes
pour que vous puissiez jouer. sauver des personnages. Notez également que dans votre version non-lue, il est écritd[expr_]:= v/...
.Perl - 121
122(+2 pour
-p
)Tester:
la source
Haskell 38 Chars
La fonction
d
prend une fonction et retourne une fonction. Il est entré sous la forme d'une série de puissance et est émis de la même manière (ce qui est un type de tout.)Par exemple, si nous entrons
x->x^2
, nous obtenonsx->2*x
.Et pour la fonction exponentielle.
la source
2^x
?4*x^3-2
) en tant qu'entrée", comme requis par l'OP.Prolog 176
Opérateurs pris en charge: binaire
+
, binaire-
, binaire*
, binaire^
, unaire-
. Notez que le unary+
n'est pas supporté.Échantillon échantillon:
Prolog est confus quand il se met en
^-
séquence. Un espace doit être inséré entre^
et-
pour analyser correctement l'expression.J'espère que votre professeur ne craint pas le désordre de l'équation.
Temps fou:
la source
C, 260
Hé, je pense connaître votre professeur! N'est-ce pas celui qui a la capacité surnaturelle de détecter les étudiants qui exécutent des fonctions de filtrage de bibliothèque dans leur tête?
Donc, utiliser
sscanf
est hors de question ... Mais ne vous inquiétez pas:Exemples courants (entrée sur
stdin
; sortie va àstdout
):Ce format est bien meilleur que juste
12*x^2
, car votre professeur peut ainsi être sûr que vous avez calculé la réponse vous-même et que vous n'avez pas triché en la copiant de quelqu'un d'autre!La sortie a un léger problème de domaine à
x=0
, mais elle est correcte presque partout !Pour référence, voici une version non-lue, lisible (par de simples mortels). Il utilise une machine à états avec 5 états et 5 catégories de caractères saisis.
PS Méfiez-vous de cette
gets
fonction: elle comporte une faille de sécurité qui peut permettre à votre enseignant d’exécuter un rootkit dans votre esprit en fournissant des informations trop longues ...la source
Lua
296268263Pas très golfed et ne peut pas gérer actuellement plusieurs termes (vous pouvez simplement le laisser tourner quelques fois, non?), Mais il peut gérer
n^x
,x^n
etn
comme entrée.Ungolfed ...
la source
str.func(str,...)
==str:func(...)
, c'est pour cette raison que les cordes ont le pouvoir d'être méticulées après tout ...l
local. Attendez-vous simplement à ce que l'entrée soit stockéea
et dites que la sortie le seral
.a:find("x")
, notez également que1then
ne fonctionne que dans Lua 5.2()
optionnel. Le1then
problème a été corrigé car je n'ai pas la version 5.2 (ne pas effectuer de mises à jour de la CPU avant la fin de la thèse, car je ne veux rien gâcher).ECMAScript 6, 127 octets
Voici ma tentative d'expression régulière (en utilisant une seule expression rationnelle et une certaine logique dans le rappel de remplacement):
Ceci attend que la chaîne d'entrée soit stockée
i
et renvoie simplement le résultat. Essayez-le dans une console compatible ECMAScript 6 (comme celle de Firefox).la source
sed, 110
Prendre très littéralement "Ils n'ont pas besoin d'être simplifiés ou formatés exactement comme indiqué ci-dessus, tant que la réponse est claire":
Le nombre d'octets comprend 1 pour le
r
drapeau.Ungolfed, avec des commentaires:
Échantillon échantillon:
Je parie que cela pourrait être joué au golf plus loin; c'est mon premier essai à
sed
. Amusement!la source
Ruby, 152
... ou 150 si vous n'avez pas besoin d'imprimer ... ou 147 si vous êtes également d'accord avec un tableau que vous devez rejoindre vous-même.
courir avec
ruby -nal
ungolfed:
Mon problème principal avec celui-ci est le nombre de caractères que la scission appropriée prend. La seule autre façon à laquelle je pouvais penser était celle
split(/(?<!\^)([-+])/)
qui donne+
et-
comme leurs propres résultats. Des indices pour une meilleure solution?De plus, y a-t-il un moyen plus rapide de retourner
s
si ce n'est pas vide, mais sinon de reveniry
? J'ai utilisés[0]?y:s
? En JS, je le feraiss||y
, mais la""
vérité est en Ruby.la source
split(/(?<!\^)(?=[-+])/)
?