ReRegex , 294 275 bayt
Daha iyi 'işlev' tanımlarını kullanarak 19 bayt kaydedildi
Bunun bir Regex sadece dili için oldukça iyi olduğunu söyleyebilirim.
Temel lib, Unary ve Decimal arasında dönüşüm sağlar (Bu, sorun spesifik olarak açıkça belirtildiği için gereklidir), ancak Binary'i desteklemez; Bu yüzden buna 120 byte ekleyen betiğin bir parçası olarak yazmak zorunda kaldım.
#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:
Çevrimiçi deneyin!
Bireysel Regexes tarafından.
#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:
adımlar
İlk olarak, iki regex veren 'base' kütüphanesini içeri aktarıyoruz. Biri u<numbers>
birliğe dönüşür . Ve dönüştürend<unary_underlines>
ondalığa . Bunun nedeni, meydanın temel10'da IO gerektirmesidir.
Sonra, birliği ikiliye çeviren bir avuç regex tanımlarız.
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
Bunlardan ilki , isteğe bağlı olarak bazı ikili basamaklar, ardından a , Ardından herhangi bir alt çizgi miktarını, ardından aynı alt çizgi alt satırları artı bir ve son olarak bir başkasını b(\d*):(_*)\2_b/b1$1:$2b/
arar .b
:
b
Daha sonra b1
bunu önce gelen ikili :
sayılarla, ardından alt çizgilerin ilk yarısında ve son olarak sonuncuyla değiştiririz.b
.
Bu nedenle, unary ikiye bölünemez olup olmadığını kontrol eder ve eğer öyleyse, 1'i ikilik hanelere hazırlar, sonra eksi ikiye böler.
İkincisi b(\d*):(_+)\2b/b0$1:$2b/
, neredeyse kimliği belirsizdir, ancak ekstraları kontrol etmez _
, yani sadece ikiye bölünebilirse eşleşir ve bu durumda bir0
bunun yerine .
Üçüncüsü, normal rakamlardan çıkıp çıkmadığımızı kontrol eder ve öyleyse, sadece ikili sayıları bırakmak için dolguyu çıkarır.
Sonuncusu, hiçbir zaman verilen hiçbir ikili rakam olup olmadığını kontrol eder ve bu durumda sadece bırakır 0
.
Tanımladığımız bir sonraki Regex grubu, ikiliyi birliğe geri dönüştürmek ve biraz daha basit hale getirmek.
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
Bu grubun ilki B(_*):1/B$1$1_:/
, antitezi gibi, a'yı B
, ardından herhangi bir Unary basamağını izliyor :1
. B
Bu durumda eşleşmeyi kontrol etmez , çünkü bir seferde sadece bir rakam arar. Bu eşleştirilirse, daha önce eşleşen tek sayı rakamlarını ikiye katlar ve birini ekler, sonra birini kaldırır.
İkincisi, B(_*):0/B$1$1:/
birinciden 0
çok eşleşmeler hariç, ilkiyle neredeyse özdeş ve ek bir tekil rakam eklemiyor 1
.
Bunlardan sonuncusu, B(_*):B/$1/
artık ikili rakam bulunup bulunmadığını kontrol eder ve eğer öyleyse unary uni açar. Antitezinin aksine, bunun özel bir 0 durumuna ihtiyacı yoktur.
Daha sonra j
, bölme işlevi olarak işlev gören regex'leri tanımlayacağız .
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
İlk, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
ağır kaldırma çoğu yapar. j
İsteğe bağlı olarak "artan" olan ikili basamakları, ardından bir virgül, ardından artandan sonra tam olarak 8 ikili basamağı, ardından ikili sayının kalanını izleyen bir virgül arar :
. 8 haneden ilki, artırıcıya eklenir, böylece artırır, daha sonra her iki ikili girişten gelen 8 haneden sonra, :
a ,
. Yani (8 yerine 2 rakam kullanıyor j,1001:
olsaydık ) j1:1001:,01
o zaman olur j10:1001,01,11
. Ek olarak, eklenen dizi öğeleriB
onları birleşik duruma dönüştürmek için s'ye .
Diğeri, j(\d*),\1\d{0,7}:,?(.*)/,$2,/
artıştan sonra kontrol etmek için geriye kalan 8 haneden az hanenin olup olmadığını kontrol eder ve öyleyse, ,
s'ye sarılmış diziden başka her şeyi kaldırır . Örneğin.,_,___,
Dizinin yaratılması sırasında ve sonrasında karşılaştırma regex'lerini tanımlarız.
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
Bunlardan ilki, ,((_+)_+),(\2),/,$1,/
virgül, ardından bir miktar alt çizgi, ardından bir miktar virgül, ardından da bir virgül, sonra da ilk alt çizgi virgül kontrol eder. Daha sonra ,
s ile çevrili ilk elemandaki toplam alt çizgi miktarıyla değiştirilir .
İkincisi, ,(_+),(\1_*),/,$2,/
bir virgül olup olmadığını, ardından bir miktar virgül, ardından başka bir virgül, sonra aynı miktarda veya daha fazla altı çizili ve son bir virgül kontrol eder. Bu yerine doğru eleman bırakacaktır.
Sonunda, eşleştirilen eleman kaldığında ^,(_*),$
, çevreleyen virgülleri siler ve ondalık karaktere geri dönüştürürüz d<>
. O zaman daha fazla regex ateşlenemez ve çıktı sunulur.
Giriş, ilk j,b:u<(?#input)>b:
önce ondalık girişi birime, örneğin 5
-> dönüştüren şablona yerleştirilir j,b:_____b:
, daha sonra elde edilen ikili, j,101:
ikiye katlanır, Sonra ikili dosyayı böler (örnek için çalışmaz), en büyük elemanı alır, dönüştürür ondalık basamağa geri döndü ve bitti.