Retina , 53 43 42 41 40 35 byte
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
Untuk menghitung tujuan setiap baris masuk dalam file terpisah, tetapi Anda dapat menjalankan di atas sebagai file tunggal dengan memanggil Retina dengan -s
bendera.
Ini mengharapkan angka-angka dalam string input untuk diberikan secara unary dan akan menghasilkan output dalam format yang sama. Misalnya
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
dari pada
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
Penjelasan
Kode ini menjelaskan satu penggantian satu regex, yang pada dasarnya 4 substitusi dikompresi menjadi satu. Perhatikan bahwa hanya satu cabang yang akan mengisi grup $2
sehingga jika salah satu dari tiga kecocokan lainnya, kecocokan hanya akan dihapus dari string. Jadi kita dapat melihat empat kasus berbeda secara terpisah:
^[^x]+<space>
<empty>
Jika mungkin untuk mencapai ruang dari awal string tanpa menemukan x
yang berarti istilah pertama adalah istilah konstan dan kami menghapusnya. Karena keserakahan +
, ini juga akan cocok dengan plus dan spasi kedua setelah suku konstan. Jika tidak ada istilah yang konstan, bagian ini tidak akan pernah cocok.
x(?= )
<empty>
Ini cocok dengan x
yang diikuti oleh spasi, yaitu x
istilah linear (jika ada), dan menghapusnya. Kita dapat yakin bahwa ada spasi setelahnya, karena tingkat polinomial selalu minimal 2.
1(?=1*x.(1+))
$1
Ini melakukan penggandaan koefisien oleh eksponen. Ini cocok dengan satu 1
dalam koefisien dan menggantinya dengan seluruh eksponen yang sesuai melalui lookahead.
(\^1)?1(?= |$)
<empty>
Ini mengurangi semua eksponen yang tersisa dengan mencocokkan trailing 1
(dipastikan oleh lookahead). Jika mungkin untuk mencocokkan ^11
(dan batas kata) kami menghapusnya sebagai gantinya, yang mengurus menampilkan istilah linear dengan benar.
Untuk kompresi, kami perhatikan bahwa sebagian besar kondisi tidak saling memengaruhi. (\^1)?
tidak akan cocok jika lookahead dalam kasus ketiga benar, jadi kita bisa menggabungkan keduanya
(\^1)?1(?=1*x.(1+)| |$)
$2
Sekarang kita sudah memiliki lookahead yang dibutuhkan untuk kasus kedua dan yang lain tidak pernah benar ketika mencocokkan x
, jadi kita bisa menggeneralisasi 1
ke \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Kasus pertama tidak benar-benar memiliki kesamaan dengan yang lain, jadi kami menyimpannya secara terpisah.