Võng mạc , 53 43 42 41 40 35 byte
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
Để đếm các mục đích, mỗi dòng đi trong một tệp riêng biệt, nhưng bạn có thể chạy ở trên dưới dạng một tệp bằng cách gọi Retina bằng -s
cờ.
Điều này hy vọng các số trong chuỗi đầu vào sẽ được đưa ra một cách đơn nhất và sẽ mang lại đầu ra ở cùng định dạng. Ví dụ
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
thay vì
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
Giải trình
Mã này mô tả một sự thay thế regex duy nhất, về cơ bản là 4 sự thay thế được nén thành một. Lưu ý rằng chỉ một trong các nhánh sẽ điền vào nhóm $2
vì vậy nếu bất kỳ một trong ba trận đấu còn lại, trận đấu sẽ chỉ bị xóa khỏi chuỗi. Vì vậy, chúng ta có thể xem xét bốn trường hợp khác nhau một cách riêng biệt:
^[^x]+<space>
<empty>
Nếu có thể đạt đến một khoảng trắng từ đầu chuỗi mà không gặp phải x
điều đó có nghĩa là thuật ngữ đầu tiên là thuật ngữ không đổi và chúng tôi xóa nó. Do sự tham lam của +
, điều này cũng sẽ phù hợp với không gian cộng và không gian thứ hai sau thời hạn không đổi. Nếu không có thuật ngữ không đổi, phần này sẽ không bao giờ khớp.
x(?= )
<empty>
Điều này khớp với x
một không gian được theo sau bởi một khoảng trắng, tức là x
thuật ngữ tuyến tính (nếu nó tồn tại) và loại bỏ nó. Chúng ta có thể chắc chắn rằng có một khoảng trắng sau nó, bởi vì mức độ của đa thức luôn luôn ít nhất là 2.
1(?=1*x.(1+))
$1
Điều này thực hiện phép nhân hệ số theo cấp số nhân. Điều này khớp với một 1
hệ số duy nhất và thay thế nó bằng toàn bộ số mũ tương ứng thông qua giao diện.
(\^1)?1(?= |$)
<empty>
Điều này làm giảm tất cả các số mũ còn lại bằng cách khớp với dấu 1
(được đảm bảo bởi giao diện). Nếu có thể khớp ^11
(và một ranh giới từ), chúng ta sẽ loại bỏ thay vào đó, điều này sẽ giúp hiển thị chính xác thuật ngữ tuyến tính.
Đối với việc nén, chúng tôi nhận thấy rằng hầu hết các điều kiện không ảnh hưởng lẫn nhau. (\^1)?
Sẽ không khớp nếu cái nhìn trong trường hợp thứ ba là đúng, vì vậy chúng ta có thể đặt hai cái đó lại với nhau như
(\^1)?1(?=1*x.(1+)| |$)
$2
Bây giờ chúng ta đã có giao diện cần thiết cho trường hợp thứ hai và những trường hợp khác không bao giờ có thể đúng khi khớp x
, vì vậy chúng ta có thể chỉ cần khái quát hóa 1
cho a \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Trường hợp đầu tiên không thực sự có điểm chung với những người khác, vì vậy chúng tôi giữ nó tách biệt.