Retina , 53 43 42 41 40 35 байт
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
В целях подсчета каждая строка идет в отдельном файле, но вы можете запустить вышеуказанное как один файл, вызвав Retina с -s
флагом.
Это предполагает, что числа во входной строке будут даны в унарном формате и будут давать выходные данные в том же формате. Например
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
коэффициенту и заменяет его на весь соответствующий показатель степени с помощью предварительного просмотра.
(\^1)?1(?= |$)
<empty>
Это уменьшает все оставшиеся экспоненты путем сопоставления конечного значения 1
(обеспечивается предварительным просмотром). Если это возможно, чтобы соответствовать ^11
(и граница слова), мы удаляем это вместо этого, который заботится о правильном отображении линейного термина.
Что касается сжатия, мы замечаем, что большинство условий не влияют друг на друга. (\^1)?
не будет совпадать, если предположение в третьем случае истинно, поэтому мы можем сложить эти два как
(\^1)?1(?=1*x.(1+)| |$)
$2
Теперь у нас уже есть предпросмотр , необходимое для второго случая , а другие никогда не могут быть истинными при совпадении x
, так что мы можем просто обобщить 1
к \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Первый случай на самом деле не имеет ничего общего с другими, поэтому мы держим его отдельно.