Rétine , 53 43 42 41 40 35 octets
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
À 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' -sindicateur.
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
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
au lieu de
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
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, $2donc 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:
^[^x]+<space>
<empty>
S'il est possible d'atteindre un espace depuis le début de la chaîne sans en rencontrer un, xcela 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.
x(?= )
<empty>
Ceci correspond à un xqui est suivi d'un espace, c'est-à-dire le xdu 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.
1(?=1*x.(1+))
$1
Ceci effectue la multiplication du coefficient par l'exposant. Cela correspond à un seul 1dans le coefficient et le remplace par l'exposant correspondant entier via la tête de lecture.
(\^1)?1(?= |$)
<empty>
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 comme
(\^1)?1(?=1*x.(1+)| |$)
$2
Maintenant, 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 le 1à a \w:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Le premier cas n'a vraiment rien de commun avec les autres, nous le séparons donc.