Retina , 53 43 42 41 40 35 bayt
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
Sayım amacıyla her satır ayrı bir dosyaya gider, ancak Retina'yı -s
bayrakla çağırarak yukarıdakileri tek bir dosya olarak çalıştırabilirsiniz .
Bu, giriş dizesindeki sayıların tekli olarak verilmesini bekler ve çıktıyı aynı biçimde verir. Örneğin
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
onun yerine
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
açıklama
Kod, temel olarak bir taneye sıkıştırılmış 4 sübstitüsyon olan tek bir regex sübstitüsyonunu tarif eder. Dallardan yalnızca birinin grubu dolduracağına $2
, diğer üç eşleşmeden herhangi biri eşleşmenin dizeden silineceğine dikkat edin. Böylece dört farklı duruma ayrı ayrı bakabiliriz:
^[^x]+<space>
<empty>
Dize ile karşılaşmadan dizenin başlangıcından bir boşluğa ulaşmak mümkünse x
, ilk terim sabit terimdir ve onu sileriz. Açgözlülüğü nedeniyle +
, bu sabit terimden sonra artı ve ikinci boşlukla da eşleşecektir. Sabit bir terim yoksa, bu bölüm hiçbir zaman eşleşmeyecektir.
x(?= )
<empty>
Bu x
, ardından gelen bir boşlukla, yani x
doğrusal terimin (varsa) eşleşir ve onu kaldırır. Bundan sonra bir boşluk olduğundan emin olabiliriz, çünkü polinom derecesi her zaman en az 2'dir.
1(?=1*x.(1+))
$1
Bu, katsayının üs tarafından çarpılmasını gerçekleştirir. Bu 1
, katsayıdaki bir tekle eşleşir ve bunu ileriye doğru karşılık gelen üsün tamamıyla değiştirir.
(\^1)?1(?= |$)
<empty>
Bu, izlemeyi 1
(ileriye dönük olarak sağlanır) eşleştirerek kalan tüm üsleri azaltır . Eşleştirmek ^11
(ve bir kelime sınırı) mümkünse , bunun yerine, doğrusal terimi doğru bir şekilde göstermeye özen gösteririz.
Sıkıştırma için, koşulların çoğunun birbirini etkilemediğini fark ediyoruz. (\^1)?
üçüncü durumda gözetleme doğruysa eşleşmez, bu yüzden bu ikisini bir araya getirebiliriz
(\^1)?1(?=1*x.(1+)| |$)
$2
Şimdi biz zaten ikinci durum için gerekli lookahead sahip ve eşleştirme yaparken diğerleri gerçek olamaz x
biz sadece genelleme böylece, 1
bir karşı \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
İlk vakanın diğerleriyle ortak bir yanı yok, bu yüzden onu ayrı tutuyoruz.