Différenciation symbolique 1: Gone Coefishin '
Tâche
Écrivez un programme qui prend un polynôme en x de stdin (1 <deg (p) <128) et le différencie. Le polynôme d'entrée sera une chaîne de la forme suivante:
"a + bx + cx^2 + dx^3 +" ...
où le coefficient de chaque terme est un entier (-128 <a <128). Chaque terme est séparé par un espace, un + et un autre espace; les termes linéaires et constants apparaissent comme ci-dessus (c.-à-d. non x^0
ou x^1
). Les termes apparaîtront par ordre croissant de degré et les puissances à coefficient nul seront omises. Tous les termes avec le coefficient 1 ou -1 affichent ce coefficient explicitement.
Votre sortie doit avoir exactement la même forme. Notez que les coefficients dans la sortie peuvent atteindre 127 * 127 == 16129.
Exemples
"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"
Notation
Votre score est la longueur de votre programme en octets, multipliée par trois si vous utilisez une bibliothèque intégrée ou une bibliothèque qui fait de l'algèbre symbolique.
Réponses:
Rétine ,
534342414035 octetsÀ des fins de comptage, chaque ligne va dans un fichier séparé, mais vous pouvez exécuter ce qui précède comme un fichier unique en appelant Retina avec l'
-s
indicateur.Cela attend que les nombres dans la chaîne d'entrée soient donnés en unaire et produiront une sortie dans le même format. Par exemple
au lieu de
Explication
Le code décrit une seule substitution d'expression régulière, qui est essentiellement 4 substitutions compressées en une seule. Notez qu'une seule des branches remplira le groupe,
$2
donc si l'une des trois autres correspondances, la correspondance sera simplement supprimée de la chaîne. Nous pouvons donc examiner les quatre cas différents séparément:S'il est possible d'atteindre un espace depuis le début de la chaîne sans en rencontrer un,
x
cela signifie que le premier terme est le terme constant et nous le supprimons. En raison de la gourmandise de+
, cela correspondra également au plus et au deuxième espace après le terme constant. S'il n'y a pas de terme constant, cette partie ne correspondra tout simplement jamais.Ceci correspond à un
x
qui est suivi d'un espace, c'est-à-dire lex
du terme linéaire (s'il existe), et le supprime. Nous pouvons être sûrs qu'il y a un espace après, car le degré du polynôme est toujours d'au moins 2.Ceci effectue la multiplication du coefficient par l'exposant. Cela correspond à un seul
1
dans le coefficient et le remplace par l'exposant correspondant entier via la tête de lecture.Cela réduit tous les exposants restants en faisant correspondre le dernier
1
(assuré par l'anticipation). S'il est possible de faire correspondre^11
(et une limite de mot), nous le supprimons à la place, ce qui prend soin d'afficher correctement le terme linéaire.Pour la compression, on remarque que la plupart des conditions ne s'influencent pas.
(\^1)?
ne correspondra pas si l'anticipation dans le troisième cas est vraie, nous pouvons donc mettre ces deux ensemble commeMaintenant, nous avons déjà l'anticipation nécessaire pour le deuxième cas et les autres ne peuvent jamais être vrais lors de la correspondance
x
, nous pouvons donc simplement généraliser le1
à a\w
:Le premier cas n'a vraiment rien de commun avec les autres, nous le séparons donc.
la source
CJam,
4341 octetsMerci à @ jimmy23013 d'avoir signalé un bug et d'avoir joué deux octets au golf!
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
Perl,
6463 octetsCode 62b + 1 ligne de commande (-p)
Pas étonnant pour le moment, mais je vais continuer d'essayer de le raccourcir.
Exemple d'utilisation:
Merci Denis pour -1b
la source
Julia, 220 octets
Pas d'expressions régulières!
Cela crée une fonction lambda qui accepte une chaîne et renvoie une chaîne. Les entrailles imitent ce qui se passe lorsque le code Julia est évalué: une chaîne est analysée en symboles, expressions et appels. Je pourrais essayer d'écrire une fonction de différenciation symbolique complète de Julia et de la proposer comme faisant partie de Julia.
Non golfé + explication:
la source
C,
204162 octetsAnalyser fondamentalement chaque terme et imprimer le terme différencié en séquence. Assez simple.
la source
JavaScript ES6, 108 octets
Extrait ES5:
la source
Python 2, 166 octets
Garçon, cela semble plus long qu'il ne devrait l'être.
La fonction
d
prend un terme non constantt
et renvoie sa dérivée. La raison pour laquelle jedef
la fonction au lieu d'utiliser un lambda est pour que je puisse affecter l'exposant moins 1 àe
, qui est ensuite utilisé quatre fois. La principale chose ennuyeuse est de devoir faire des allers-retours entre les chaînes et les entiers, bien que l'opérateur de backtick de Python 2 y contribue.Nous divisons ensuite l'entrée en termes et faisons appel
d
à chacun qui en contient"x"
, éliminant ainsi le terme constant. Les résultats sont réunis et imprimés.la source
CJam,
62575549 octetsEh bien, Dennis a fait honte avant même que je remarque que le site était de retour. Mais voici ma création quand même:
La dernière version enregistre quelques octets avec les raccourcis suggérés par @Dennis (utilisez des variables et divisez-les dans l'espace au lieu de
+
).Essayez-le en ligne
la source
_({'^a\}{;}?
1 octet de plus que:T({T'^a\}&
.~
dans le bloc else restant et pouvez également éliminer celui-ci.x
. J'ai trouvé quelques améliorations supplémentaires pendant que j'y étais. Surtout, parce que j'ai maintenant les valeurs dans les variables, je peux les rappeler là où j'en ai vraiment besoin, en économisant une certaine manipulation de la pile. J'ai également eu une erreura
qui aurait dû être supprimée lorsque j'ai optimisé la génération de sortie plus tôt.Pyth, 62 octets
Solution assez moche, utilisant certaines substitutions d'expression régulière.
la source
Python 3, 176 octets
En effet, le principal inconvénient est de devoir convertir entre les chaînes et les entiers. De plus, si un terme constant était requis, le code ne serait que de 153 octets.
la source
Python 2, 229 octets
la source
Python 2, 174 octets
Malheureusement, l'astuce de DLosc pour renommer la méthode de partage et effectuer la différenciation dans une fonction spécifique ne raccourcit pas mon code ...
la source