ReRegex , 294 275 bytes
Economizou 19 bytes usando melhores definições de 'função'
Eu diria que isso é muito bom para um idioma exclusivo do Regex.
A lib base permite a conversão entre Unário e Decimal (o que é necessário, pois a especificação do desafio declara explicitamente decimal), mas não suporta Binário; Então eu tive que escrever isso como parte do script, adicionando 120 bytes a ele.
#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:
Experimente online!
Por regexes individuais.
#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:
Passos
Primeiramente, importamos a biblioteca 'base', que fornece duas regexes. Um que se converte u<numbers>
em unário. E um que converted<unary_underlines>
novamente em decimal. Isso ocorre porque o desafio requer E / S na base10.
Em seguida, definimos um punhado de expressões regulares que convertem unário em binário.
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
O primeiro deles, b(\d*):(_*)\2_b/b1$1:$2b/
busca b
, opcionalmente seguido por alguns dígitos binários, depois a :
, Então qualquer quantidade de sublinhados, seguido pela mesma quantidade exata de sublinhados mais um e, finalmente, outro b
.
Em seguida, substituímos isso por b1
seguido pelos dígitos binários de antes :
, e apenas a primeira metade dos sublinhados e, finalmente, o último b
.
Portanto, isso verifica se o unário não é divisível por dois e, em caso afirmativo, acrescenta 1 aos dígitos binários, depois o divide menos um por dois.
O segundo, b(\d*):(_+)\2b/b0$1:$2b/
é quase idêntico, no entanto, não verifica um extra _
, o que significa que só corresponde se for divisível por dois e, nesse caso, precede um 0
.
O terceiro verifica se estamos com dígitos unários e, nesse caso, retira o preenchimento para deixar os dígitos binários.
O último verifica se nunca houve dígitos binários fornecidos e, nesse caso, apenas sai 0
.
O próximo grupo de Regexes que definimos é converter o binário novamente em unário e é um pouco mais simples.
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
O primeiro desse grupo, B(_*):1/B$1$1_:/
assim como sua antítese, detecta a B
, seguido por qualquer quantidade de dígitos unários :1
. Não verifica a correspondência B
nesse caso, pois está procurando apenas um dígito por vez. Se isso corresponder, ele dobra a quantidade anteriormente combinada de dígitos unários e adiciona um, depois o remove.
O segundo B(_*):0/B$1$1:/
,, é quase idêntico ao primeiro, exceto que corresponde 0
a um 1
e não a e não adiciona um dígito unário adicional.
O último deles, B(_*):B/$1/
verifica se não há mais dígitos binários e, se for o caso, desembrulha o unário. Ao contrário de sua antítese, isso não precisa de um caso 0 especial.
Em seguida, definimos as j
expressões regulares, que atuam como uma função de divisão.
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
O primeiro, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
faz a maior parte do trabalho pesado. Ele procura j
, opcionalmente seguido por dígitos binários que são o "incrementador", depois uma vírgula seguida pelo incrementador e, em seguida, exatamente 8 dígitos binários seguidos pelo restante do número binário, depois a :
. O primeiro dos 8 dígitos é anexado ao incrementador, incrementando-o e, em seguida, tudo, exceto os 8 dígitos da entrada binária, é acrescentado após o :
seguinte a ,
. Então (se estivéssemos usando 2 dígitos em vez de 8) j,1001:
ficaria j1:1001:,01
então j10:1001,01,11
. Além disso, os elementos da matriz anexados são agrupados em B
s, para convertê-los novamente em unários.
O outro j(\d*),\1\d{0,7}:,?(.*)/,$2,/
verifica se há menos de 8 dígitos binários para verificar após o incrementador e, se houver, remove tudo que não seja a matriz agrupada em ,
s. Por exemplo.,_,___,
Durante e após a criação da matriz, definimos os regexes de comparação.
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
O primeiro deles ,((_+)_+),(\2),/,$1,/
verifica uma vírgula seguida de uma quantidade de sublinhados e, em seguida, um pouco mais, seguida por uma vírgula e, em seguida, a primeira quantidade de sublinhados, que uma vírgula. Em seguida, o substitui pela quantidade total de sublinhados no primeiro elemento cercado por ,
s.
O último, ,(_+),(\1_*),/,$2,/
verifica uma vírgula seguida por uma quantidade de sublinhados seguida por outra vírgula, depois a mesma quantidade ou mais sublinhados e uma última vírgula. Em vez disso, isso deixará o elemento certo.
Finalmente, quando houver um elemento à esquerda correspondente ^,(_*),$
, removemos as vírgulas ao redor e as convertemos novamente em decimal via d<>
. Em seguida, não mais regexes podem ser acionadas e a saída é apresentada.
A entrada é inicialmente colocada no modelo j,b:u<(?#input)>b:
, que primeiro converte a entrada decimal em unária, por exemplo 5
- -> j,b:_____b:
, depois a unária resultante em binária. j,101:
Em seguida , divide o binário (que não funciona no exemplo), obtém o maior elemento e converte de volta ao decimal e pronto.