Retina , 53 43 42 41 40 35 bytes
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
Para contar, cada línea va en un archivo separado, pero puede ejecutar lo anterior como un solo archivo invocando Retina con la -s
bandera.
Esto espera que los números en la cadena de entrada se den en unario y producirán resultados en el mismo formato. P.ej
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
en lugar de
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
Explicación
El código describe una única sustitución de expresiones regulares, que es básicamente 4 sustituciones comprimidas en una. Tenga en cuenta que solo una de las ramas llenará el grupo, $2
por lo que si cualquiera de las otras tres coincide, la coincidencia simplemente se eliminará de la cadena. Entonces podemos ver los cuatro casos diferentes por separado:
^[^x]+<space>
<empty>
Si es posible llegar a un espacio desde el comienzo de la cadena sin encontrar uno, x
eso significa que el primer término es el término constante y lo eliminamos. Debido a la codicia de +
, esto también coincidirá con el más y el segundo espacio después del término constante. Si no hay un término constante, esta parte simplemente nunca coincidirá.
x(?= )
<empty>
Esto coincide con un x
seguido de un espacio, es decir, el x
del término lineal (si existe), y lo elimina. Podemos estar seguros de que hay un espacio después, porque el grado del polinomio siempre es al menos 2.
1(?=1*x.(1+))
$1
Esto realiza la multiplicación del coeficiente por el exponente. Esto coincide con un solo 1
en el coeficiente y lo reemplaza por todo el exponente correspondiente a través de la búsqueda anticipada.
(\^1)?1(?= |$)
<empty>
Esto reduce todos los exponentes restantes al hacer coincidir el final 1
(asegurado por la búsqueda anticipada). Si es posible hacer coincidir ^11
(y un límite de palabra), lo eliminamos, lo que se encarga de mostrar el término lineal correctamente.
Para la compresión, notamos que la mayoría de las condiciones no se afectan entre sí. (\^1)?
no coincidirá si la anticipación en el tercer caso es verdadera, por lo que podemos juntar esos dos como
(\^1)?1(?=1*x.(1+)| |$)
$2
Ahora ya tenemos el lookahead necesario para el segundo caso y los otros nunca pueden ser verdaderos cuando coinciden x
, por lo que simplemente podemos generalizar 1
a \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
El primer caso realmente no tiene nada en común con los demás, por lo que lo mantenemos separado.