Il conteggio dei byte presuppone la codifica ISO 8859-1.
10$*
1
,1$`
,1+
$_¶
(?<=(¶?.+)+)1
$#1$*
1{10}1?
,(1*)
$.1
Provalo online!
Spiegazione
Un'altra implementazione dell'algoritmo ...% 11% 10 . La parte divertente di farlo con una regex è che possiamo occuparci di entrambi i calcoli del modulo contemporaneamente.
10$*
Inizializza la stringa su dieci 1s.
1
,1$`
Sostituisci ciascuno di questi con una virgola, una e il prefisso davanti a quella. Questo dà ,1,11,...,1111111111, cioè un intervallo unario.
,1+
$_¶
Ora sostituisci ciascuno degli elementi dell'intervallo con l'intera stringa seguita da un avanzamento riga. Questo ci dà una griglia 10x10 di numeri unari che indicano la colonna corrente.
(?<=(¶?.+)+)1
$#1$*
Abbina ciascuno 1e determina su quale riga si trova ripetendo il gruppo uno più volte. Sostituisci il 1con tanti 1s. Ciò moltiplica i valori in ciascuna riga per l'indice basato su 1 della riga.
1{10}1?
Ora facciamo mod 11, mod 10 in un solo passaggio. Per fare la mod 11 , normalmente rimuoveremmo tutto 1{11}dalla stringa da lasciare con i resti. E dopo lo rimuoveremmo 1{10}. Ma se rimuoviamo solo dieci 1s più un altro, se possibile, l'avidità del motore regex farà la mod 11 per noi il più a lungo possibile, e in caso contrario, proverà almeno la mod 10 .
,(1*)
$.1
Infine, convertiamo ogni numero in decimale sostituendolo con la sua lunghezza.