ReRegex , 294 275 byte
19 byte salvati utilizzando definizioni migliori di "funzioni"
Direi che questo è abbastanza buono per una lingua solo Regex.
La libreria di base consente la conversione tra Unario e Decimale (che è necessario poiché la specifica della sfida indica esplicitamente il decimale), ma non supporta Binario; Quindi ho dovuto scriverlo come parte dello script aggiungendo 120 byte ad esso.
#import base
b(\d*):(_*)\2_b/b1$1:$2b/b(\d*):(_+)\2b/b0$1:$2b/b(\d+):b/$1/b:b/0/B(_*):1/B$1$1_:/B(_*):0/B$1$1:/B(_*):B/$1/j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/j(\d*),\1\d{0,7}:,?(.*)/,$2,/,((_+)_+),(\2),/,$1,/,(_+),(\1_*),/,$2,/^,(_*),$/d<$1>/j,b:u<(?#input)>b:
Provalo online!
Per singoli regimi.
#import base
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
^,(_*),$/d<$1>/
j,b:u<(?#input)>b:
passi
Innanzitutto, importiamo la libreria "base", che fornisce due regex. Uno che si converte u<numbers>
in unario. E uno che si converte d<unary_underlines>
nuovamente in decimale. Questo perché la sfida richiede IO in base10.
Quindi definiamo una manciata di regex che convertono unario in binario.
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
Il primo di questi, b(\d*):(_*)\2_b/b1$1:$2b/
cerca b
, facoltativamente seguito da alcune cifre binarie, quindi a :
, quindi qualsiasi quantità di sottolineature, seguita dalla stessa identica quantità di sottolineature più una, e infine un'altra b
.
Sostituiamo quindi quello con b1
seguito dalle cifre binarie di prima :
, e solo la prima metà dei caratteri di sottolineatura, e infine l'ultimab
.
Quindi questo controlla se l'unario non è divisibile per due e, in tal caso, antepone 1 alle sue cifre binarie, quindi lo divide meno uno per due.
Il secondo, b(\d*):(_+)\2b/b0$1:$2b/
è quasi identico, tuttavia non controlla un extra _
, il che significa che corrisponde solo se è divisibile per due, e in questo caso antepone un0
invece.
Il terzo controlla se non abbiamo cifre unarie e, in tal caso, rimuove l'imbottitura per lasciare solo le cifre binarie.
L'ultimo controlla se non sono mai state fornite cifre binarie e in quel caso se ne va 0
.
Il prossimo gruppo di Regex che definiamo è di convertire i binari in unari e sono leggermente più semplici.
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
Il primo di questo gruppo, B(_*):1/B$1$1_:/
molto simile alla sua antitesi, rileva quindi una B
, seguita da qualsiasi quantità di cifre unarie :1
. In B
questo caso non controlla la corrispondenza , in quanto cerca solo una cifra alla volta. Se corrisponde, raddoppia la quantità di cifre unarie precedentemente abbinata e ne aggiunge una, quindi rimuove quella.
Il secondo, B(_*):0/B$1$1:/
è quasi identico al primo, tranne le partite a 0
piuttosto che a1
, e non aggiunge una cifra unaria aggiuntiva.
L'ultimo di questi, B(_*):B/$1/
controlla se non ci sono più cifre binarie e, in tal caso, scartare il unario. A differenza della sua antitesi, questo non ha bisogno di un caso 0 speciale.
Successivamente definiamo le j
regex, che agiscono come una funzione di divisione.
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
Il primo, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
fa la maggior parte del sollevamento pesante. Cerca j
, facoltativamente seguito da cifre binarie che sono "incrementatore", quindi una virgola seguita da un incrementatore quindi esattamente 8 cifre binarie seguite dal resto del numero binario, quindi a :
. La prima delle 8 cifre viene aggiunta all'incremento, quindi incrementandola, quindi tutto tranne quelle 8 cifre dall'input binario viene aggiunto dopo il :
seguente a ,
. Quindi (se stessimo usando 2 cifre anziché 8) j,1001:
diventerebbe j1:1001:,01
allora j10:1001,01,11
. Inoltre, gli elementi dell'array aggiunti sono racchiusi in B
s, per convertirli in unari.
L'altro, j(\d*),\1\d{0,7}:,?(.*)/,$2,/
controlla se ci sono meno di 8 cifre binarie da controllare dopo l'incrementatore e, in tal caso, rimuove tutto tranne l'array racchiuso in ,
s. Per esempio.,_,___,
Durante e dopo la creazione dell'array definiamo le regex di confronto.
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
Il primo di questi, ,((_+)_+),(\2),/,$1,/
controlla una virgola seguita da un numero di caratteri di sottolineatura, poi un po 'di più, seguito da una virgola, quindi il primo numero di caratteri di sottolineatura, rispetto a una virgola. Quindi lo sostituisce con la quantità totale di caratteri di sottolineatura nel primo elemento circondato da,
s.
L'ultimo, ,(_+),(\1_*),/,$2,/
controlla una virgola seguita da un numero di caratteri di sottolineatura seguito da un'altra virgola, quindi lo stesso importo o più caratteri di sottolineatura e un'ultima virgola. Questo invece lascerà l'elemento giusto.
Alla fine, quando sull'elemento rimane così corrispondente ^,(_*),$
, rimuoviamo le virgole circostanti e riconvertiamo in decimale viad<>
. Quindi non possono più attivarsi regex e viene presentato l'output.
L'input viene inizialmente inserito nel modello j,b:u<(?#input)>b:
, che prima converte l'input decimale in unario, ad es. 5
-> j,b:_____b:
, quindi il risultato unario in binario, j,101:
quindi suddivide il binario (che non funziona per l'esempio), ottiene l'elemento più grande, converte torna al decimale e fatto.