Сітківка , 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
в коефіцієнті і замінює його на весь відповідний показник через lookahead.
(\^1)?1(?= |$)
<empty>
Це зменшує всі інші експоненти за рахунок узгодження задніх сторін 1
(забезпечених lookahead). Якщо можливо збігнути ^11
(і межу слова), ми видалимо це замість цього, що піклується про правильне відображення лінійного терміна.
Для стиснення ми помічаємо, що більшість умов не впливають один на одного. (\^1)?
не буде відповідати, якщо пошук у третьому випадку є вірним, тому ми можемо скласти ці два як
(\^1)?1(?=1*x.(1+)| |$)
$2
Тепер у нас вже є пошук, необхідний для другого випадку, а інші ніколи не можуть бути правдивими при зіставленні x
, тому ми можемо просто узагальнити 1
до \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Перший випадок насправді не має нічого спільного з іншими, тому ми тримаємо це окремо.