เรติน่า , 53 43 42 41 40 35 ไบต์
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
สำหรับวัตถุประสงค์ในการนับแต่ละบรรทัดจะเป็นไฟล์แยกต่างหาก แต่คุณสามารถเรียกใช้ไฟล์ข้างต้นเป็นไฟล์เดียวได้โดยเรียกใช้ Retina ด้วยการ-sตั้งค่าสถานะ
สิ่งนี้คาดว่าตัวเลขในสตริงอินพุตจะถูกกำหนดเป็น unaryและจะให้ผลลัพธ์ในรูปแบบเดียวกัน เช่น
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
คำอธิบาย
รหัสอธิบายการทดแทน regex เดียวซึ่งโดยทั่วไปจะมีการทดแทน 4 รายการที่ถูกบีบอัดไว้ในที่เดียว โปรดทราบว่าหนึ่งในกิ่งไม้เท่านั้นที่จะเติมกลุ่ม$2ดังนั้นหากหนึ่งในสามการแข่งขันอื่น ๆ การแข่งขันจะถูกลบออกจากสาย ดังนั้นเราสามารถดูกรณีที่แตกต่างกันสี่กรณี:
^[^x]+<space>
<empty>
หากเป็นไปได้ที่จะเข้าถึงช่องว่างจากจุดเริ่มต้นของสตริงโดยไม่ต้องพบxว่าหมายถึงคำแรกคือคำคงที่และเราลบ เนื่องจากความโลภของ+สิ่งนี้จะตรงกับช่องว่างบวกและช่องว่างหลังจากระยะคงที่ หากไม่มีคำที่คงที่ส่วนนี้จะไม่ตรงกัน
x(?= )
<empty>
สิ่งนี้ตรงกับxที่ตามด้วยช่องว่างนั่นคือxของคำเชิงเส้น (ถ้ามี) และลบออก เราสามารถมั่นใจได้ว่ามีช่องว่างหลังจากนั้นเพราะระดับของพหุนามมีอย่างน้อย 2 เสมอ
1(?=1*x.(1+))
$1
วิธีนี้จะทำการคูณสัมประสิทธิ์ของเลขชี้กำลัง สิ่งนี้จับคู่หนึ่งเดียว1ในสัมประสิทธิ์และแทนที่ด้วยเลขชี้กำลังทั้งหมดที่เกี่ยวข้องผ่าน lookahead
(\^1)?1(?= |$)
<empty>
สิ่งนี้จะลดเลขชี้กำลังที่เหลืออยู่ทั้งหมดโดยจับคู่กับส่วนท้าย1(ทำให้แน่ใจโดย lookahead) หากเป็นไปได้ที่จะจับคู่^11(และขอบเขตของคำ) เราจะลบสิ่งนั้นแทนซึ่งจะดูแลการแสดงคำเชิงเส้นอย่างถูกต้อง
สำหรับการบีบอัดเราสังเกตว่าเงื่อนไขส่วนใหญ่จะไม่ส่งผลกระทบต่อกันและกัน (\^1)?จะไม่ตรงกันถ้า lookahead ในกรณีที่สามเป็นจริงดังนั้นเราจึงสามารถรวมสองสิ่งนี้เข้าด้วยกันเป็น
(\^1)?1(?=1*x.(1+)| |$)
$2
ตอนนี้เรามี lookahead ที่จำเป็นสำหรับกรณีที่สองและสิ่งอื่น ๆ ไม่สามารถเป็นจริงได้เมื่อทำการจับคู่xดังนั้นเราจึงสามารถสรุป1ให้ a \w:
(\^1)?\w(?=1*x.(1+)| |$)
$2
กรณีแรกไม่มีอะไรที่เหมือนกันกับคนอื่นดังนั้นเราจึงแยกกัน