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' -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
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, $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:
^[^x]+<space>
<empty>
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.
x(?= )
<empty>
Ceci correspond à un x
qui est suivi d'un espace, c'est-à-dire le x
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.
1(?=1*x.(1+))
$1
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.
(\^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.