網膜、53 43 42 41 40 35バイト
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
カウントのために、各行は個別のファイルに入れられますが、-s
フラグを使用してRetinaを呼び出すことで、上記を単一のファイルとして実行できます。
これは、入力文字列の数値が単項で与えられることを期待し、同じ形式で出力を生成します。例えば
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
の代わりに
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
説明
このコードでは、1つの正規表現の置換について説明しています。これは、基本的に4つの置換を1つに圧縮したものです。groupを埋めるのは1つのブランチのみである$2
ため、他の3つのいずれかが一致すると、その一致は文字列から単に削除されることに注意してください。したがって、4つの異なるケースを別々に見ることができます。
^[^x]+<space>
<empty>
に遭遇するx
ことなく文字列の先頭からスペースに到達できる場合、それは最初の用語が定数用語であり、それを削除することを意味します。の貪欲さのため+
、これは定数項の後のプラスと2番目のスペースにも一致します。定数項がない場合、この部分は単純に一致しません。
x(?= )
<empty>
これx
は、後に続くスペース、つまりx
線形項(存在する場合)に一致し、それを削除します。多項式の次数は常に少なくとも2であるため、その後にスペースがあることを確認できます。
1(?=1*x.(1+))
$1
これにより、係数と指数の乗算が実行されます。これ1
は、係数内の単一の要素と一致し、先読みを介して対応する指数全体で置き換えます。
(\^1)?1(?= |$)
<empty>
これは、末尾1
(先読みで保証)を一致させることにより、残りのすべての指数を削減します。一致する可能性がある場合^11
(および単語の境界)、代わりにそれを削除し、線形項を正しく表示するようにします。
圧縮については、ほとんどの条件が相互に影響を与えないことがわかります。(\^1)?
3番目のケースの先読みがtrueの場合は一致しないため、これら2つを次のようにまとめることができます。
(\^1)?1(?=1*x.(1+)| |$)
$2
マッチング時に今、私たちはすでに第二ケースと他人のために必要な先読みは、真なることはありませんしているx
ので、我々は単純に一般化することができます1
に\w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
最初のケースは、他のケースと実際には共通点がないため、個別に保管します。