망막 , 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
설명
이 코드는 단일 정규식 대체를 설명하며 기본적으로 4 개의 대체가 하나로 압축됩니다. 분기 중 하나만 그룹을 채울 수 $2
있으므로 다른 세 가지 중 하나 라도 일치하면 문자열에서 일치하는 항목이 삭제됩니다. 따라서 우리는 네 가지 경우를 개별적으로 볼 수 있습니다.
^[^x]+<space>
<empty>
문자열의 처음부터 공백없이 닿을 수 있다면 x
첫 번째 항은 상수 항이며이를 삭제합니다. 의 탐욕으로 인해 +
, 이것은 또한 일정 기간 이후의 플러스와 두 번째 공백과 일치합니다. 상수 항이 없으면이 부분은 절대 일치하지 않습니다.
x(?= )
<empty>
이는 x
뒤에 공백 x
이있는 선형 용어 (있는 경우) 와 일치하여 제거합니다. 다항식의 차수가 항상 2 이상이므로 그 뒤에 공백이 있는지 확인할 수 있습니다.
1(?=1*x.(1+))
$1
계수에 지수를 곱합니다. 이것은 1
계수에서 단일 을 일치 시키고 lookahead를 통해 해당하는 전체 지수로 대체합니다.
(\^1)?1(?= |$)
<empty>
이렇게하면 후행을 일치시켜 1
(예측에 의해 보장됨) 나머지 지수를 모두 줄 입니다. 일치 ^11
하는 단어 (및 단어 경계)가 가능하면 선형 용어를 올바르게 표시하는 대신이를 제거합니다.
압축의 경우 대부분의 조건이 서로 영향을 미치지 않습니다. (\^1)?
세 번째 경우의 예견이 참이면 일치하지 않으므로이 두 가지를 함께
(\^1)?1(?=1*x.(1+)| |$)
$2
이제 우리는 이미 두 번째 경우에 필요한 내다을 가지고 일치 할 때 다른 사람은 사실 없다 x
우리는 단순히 일반화 할 수 있도록, 1
A와를 \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
첫 번째 사례는 다른 사례와 공통점이 없기 때문에 별도로 유지합니다.