Retina , 53 43 42 41 40 35 byte
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
Ai fini del conteggio ogni riga va in un file separato, ma è possibile eseguire quanto sopra come un singolo file invocando Retina con il -s
flag.
Questo si aspetta che i numeri nella stringa di input vengano forniti in modo unario e genererà output nello stesso formato. Per esempio
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
invece di
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
Spiegazione
Il codice descrive una singola sostituzione regex, che è sostanzialmente 4 sostituzioni compresse in una. Nota che solo uno dei rami riempirà il gruppo, $2
quindi se una qualsiasi delle altre tre corrisponde, la corrispondenza verrà semplicemente eliminata dalla stringa. Quindi possiamo esaminare i quattro diversi casi separatamente:
^[^x]+<space>
<empty>
Se è possibile raggiungere uno spazio dall'inizio della stringa senza incontrarne uno x
significa che il primo termine è il termine costante e lo eliminiamo. A causa dell'avidità di +
, questo corrisponderà anche al più e al secondo spazio dopo il termine costante. Se non esiste un termine costante, questa parte semplicemente non corrisponderà mai.
x(?= )
<empty>
Questo corrisponde a uno x
che è seguito da uno spazio, ovvero il x
termine del termine lineare (se esiste) e lo rimuove. Possiamo essere sicuri che ci sia uno spazio dopo di esso, perché il grado del polinomio è sempre almeno 2.
1(?=1*x.(1+))
$1
Ciò esegue la moltiplicazione del coefficiente per l'esponente. Questo corrisponde a un singolo 1
nel coefficiente e lo sostituisce con l'intero esponente corrispondente tramite il lookahead.
(\^1)?1(?= |$)
<empty>
Ciò riduce tutti gli esponenti rimanenti abbinando il trascinamento 1
(garantito dal lookahead). Se è possibile abbinare ^11
(e un limite di parole) lo rimuoviamo invece, il che si occupa di visualizzare correttamente il termine lineare.
Per la compressione, notiamo che la maggior parte delle condizioni non si influenzano a vicenda. (\^1)?
non corrisponderà se il lookahead nel terzo caso è vero, quindi possiamo mettere insieme quei due come
(\^1)?1(?=1*x.(1+)| |$)
$2
Ora abbiamo già il lookahead necessario per il secondo caso e gli altri non possono mai essere veri durante la corrispondenza x
, quindi possiamo semplicemente generalizzare il 1
a \w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
Il primo caso non ha davvero nulla in comune con gli altri, quindi lo teniamo separato.