Retina , 53 43 42 41 40 35 bytes
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
Para fins de contagem, cada linha entra em um arquivo separado, mas você pode executar o procedimento acima como um único arquivo, chamando Retina com o -s
sinalizador.
Isso espera que os números na sequência de entrada sejam fornecidos em unário e produzirão a saída no mesmo formato. Por exemplo
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
ao invés de
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
Explicação
O código descreve uma única substituição de regex, que é basicamente 4 substituições compactadas em uma. Observe que apenas uma das ramificações preencherá o grupo. $2
Se alguma das outras três corresponder, a correspondência será simplesmente excluída da sequência. Então, podemos analisar os quatro casos diferentes separadamente:
^[^x]+<space>
<empty>
Se é possível alcançar um espaço desde o início da string sem encontrar um, x
isso significa que o primeiro termo é o termo constante e nós o excluímos. Devido à ganância +
, isso também corresponderá ao mais e ao segundo espaço após o termo constante. Se não houver um termo constante, essa parte simplesmente nunca corresponderá.
x(?= )
<empty>
Isso corresponde a um x
que é seguido por um espaço, ou seja, x
o termo linear (se existir), e o remove. Podemos ter certeza de que há um espaço depois dele, porque o grau do polinômio é sempre pelo menos 2.
1(?=1*x.(1+))
$1
Isso realiza a multiplicação do coeficiente pelo expoente. Isso corresponde a um único 1
no coeficiente e o substitui por todo o expoente correspondente por meio do visor.
(\^1)?1(?= |$)
<empty>
Isso reduz todos os expoentes restantes, correspondendo à direita 1
(garantida pela cabeça de impressão). Se for possível corresponder ^11
(e um limite de palavras), removeremos isso, o que cuidará da exibição correta do termo linear.
Para a compactação, percebemos que a maioria das condições não se afetam. (\^1)?
não corresponderá se o lookahead no terceiro caso for verdadeiro, para que possamos colocar esses dois juntos como
(\^1)?1(?=1*x.(1+)| |$)
$2
Agora já temos a aparência necessária para o segundo caso e os outros nunca podem ser verdadeiros quando combinados x
, para que possamos simplesmente generalizar o 1
para \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
O primeiro caso realmente não tem nada em comum com os outros, então mantemos em separado.