ReRegex , 294 275 octets
19 octets enregistrés en utilisant de meilleures définitions de «fonction»
Je dirais que c'est assez bon pour une langue Regex uniquement.
La bibliothèque de base permet la conversion entre Unary et Decimal (ce qui est nécessaire car la spécification de défi indique explicitement décimal), mais ne prend pas en charge Binary; J'ai donc dû l'écrire dans le cadre du script en y ajoutant 120 octets.
#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:
Essayez-le en ligne!
Par des expressions rationnelles individuelles.
#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:
Pas
Premièrement, nous importons la bibliothèque «de base», qui donne deux expressions régulières. Celui qui se transforme u<numbers>
en unaire. Et celui qui convertitd<unary_underlines>
en décimal. En effet, le défi nécessite des E / S en base10.
Ensuite, nous définissons une poignée de regex qui convertissent unaire en binaire.
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
Le premier d'entre eux, b(\d*):(_*)\2_b/b1$1:$2b/
recherche b
, éventuellement suivi de quelques chiffres binaires, puis a :
, puis n'importe quel nombre de soulignements, suivi du même nombre exact de soulignements plus un, et enfin un autre b
.
Nous remplaçons ensuite cela par b1
suivi des chiffres binaires d'avant, :
et juste la première moitié des traits de soulignement, et enfin la dernière b
.
Donc, cela vérifie si l'unaire n'est pas divisible par deux, et si c'est le cas, ajoute 1 à ses chiffres binaires, puis le divise moins un par deux.
Le second b(\d*):(_+)\2b/b0$1:$2b/
est presque idendique, mais ne recherche pas de supplément _
, ce qui signifie qu'il ne correspond que s'il est divisible par deux, et dans ce cas, ajoute un à la 0
place.
Le troisième vérifie si nous n'avons plus de chiffres unaires, et si c'est le cas, supprime le rembourrage pour ne laisser que les chiffres binaires.
Le dernier vérifie s'il n'y a jamais eu de chiffres binaires fournis, et dans ce cas, laisse simplement 0
.
Le groupe suivant de regex que nous définissons consiste à reconvertir le binaire en unaire, et est légèrement plus simple.
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
Le premier de ce groupe, B(_*):1/B$1$1_:/
tout comme son antithèse, détecte alors un B
, suivi de n'importe quelle quantité de chiffres unaires :1
. Il ne vérifie pas la correspondanceB
dans ce cas, car il ne recherche qu'un seul chiffre à la fois. Si cela correspond, il double le nombre de chiffres unaires précédemment appariés et en ajoute un, puis supprime celui-ci.
Le second B(_*):0/B$1$1:/
,, est presque identique au premier, sauf qu'il correspond à a 0
plutôt qu'à a 1
, et n'ajoute pas de chiffre unaire supplémentaire.
Le dernier de ces derniers, B(_*):B/$1/
vérifie s'il n'y a plus de chiffres binaires, et si c'est le cas, décompresse l'unaire. Contrairement à son antithèse, cela n'a pas besoin d'un cas 0 spécial.
Ensuite, nous définissons les j
regexes, qui agissent comme une fonction de division.
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
Le premier, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
fait la plupart des travaux lourds. Il recherche j
, éventuellement suivi de chiffres binaires qui sont "l'incrémenteur", puis une virgule suivie de l'incrémenteur puis exactement 8 chiffres binaires suivis du reste du nombre binaire, puis a :
. Le premier des 8 chiffres est ajouté à l'incrémenteur, l'incrémentant ainsi, puis tout sauf les 8 chiffres de l'entrée binaire est ajouté après le :
suivant a ,
. Donc (si nous utilisions 2 chiffres au lieu de 8) j,1001:
deviendrait j1:1001:,01
alors j10:1001,01,11
. En outre, les éléments de tableau ajoutés sont enveloppés dans B
s, pour les reconvertir en unaire.
L'autre j(\d*),\1\d{0,7}:,?(.*)/,$2,/
vérifie s'il reste moins de 8 chiffres binaires à vérifier après l'incrémenteur et, dans l'affirmative, supprime tout autre que le tableau encapsulé dans ,
s. Par exemple.,_,___,
Pendant et après la création du tableau, nous définissons les expressions rationnelles de comparaison.
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
La première d'entre elles, ,((_+)_+),(\2),/,$1,/
vérifie une virgule suivie d'une certaine quantité de soulignements, puis de quelques autres, suivis d'une virgule, puis de la première quantité de soulignements, qu'une virgule. Il le remplace ensuite par le nombre total de soulignements dans le premier élément entouré de l' ,
art.
Ce dernier, ,(_+),(\1_*),/,$2,/
vérifie la présence d'une virgule suivie d'une certaine quantité de tirets bas suivis d'une autre virgule, puis du même montant ou de plusieurs tirets bas, et d'une dernière virgule. Cela laissera à la place le bon élément.
Enfin, quand il y a un élément restant correspondant ^,(_*),$
, nous supprimons les virgules environnantes et reconvertissons en décimal via d<>
. Ensuite, plus aucune expression régulière ne peut se déclencher et la sortie est présentée.
L'entrée est initialement placée dans le modèle j,b:u<(?#input)>b:
, qui convertit d'abord l'entrée décimale en unaire, par exemple 5
-> j,b:_____b:
, puis l'unaire résultant en binaire, j,101:
puis divise le binaire (qui ne fonctionne pas pour l'exemple), obtient le plus grand élément, convertit retour à la décimale, et terminé.