ReRegex , 294 275 byte
Disimpan 19 byte dengan menggunakan definisi 'fungsi' yang lebih baik
Saya akan mengatakan ini cukup baik untuk bahasa Regex saja.
Lib dasar memang memungkinkan untuk konversi antara Unary dan Desimal (Yang diperlukan sebagai spec tantangan secara eksplisit menyatakan desimal), tetapi tidak mendukung Binary; Jadi saya harus menulis itu sebagai bagian dari skrip yang menambahkan 120 byte ke dalamnya.
#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:
Cobalah online!
Dengan Regex Individual.
#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:
Tangga
Pertama, kami mengimpor perpustakaan 'basis', yang memberikan dua regex. Yang dikonversi u<numbers>menjadi unary. Dan yang bertobatd<unary_underlines> kembali menjadi desimal. Ini karena tantangannya membutuhkan IO di base10.
Kemudian kita mendefinisikan beberapa regex yang mengubah unary menjadi biner.
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
Yang pertama dari ini, b(\d*):(_*)\2_b/b1$1:$2b/mencari b, secara opsional diikuti oleh beberapa digit biner, lalu a :, Kemudian jumlah garis bawah, diikuti oleh jumlah garis bawah yang sama persis ditambah satu, dan akhirnya yang lain b.
Kami kemudian menggantinya dengan b1diikuti oleh angka-angka biner dari sebelumnya :,, dan hanya setengah dari garis bawah, dan akhirnya yang terakhir b.
Jadi ini memeriksa jika unary tidak dapat dibagi dua, dan jika demikian, menambahkan 1 ke angka binernya, kemudian membaginya menjadi minus satu per dua.
Yang kedua, b(\d*):(_+)\2b/b0$1:$2b/hampir idendis, namun tidak memeriksa untuk tambahan _, artinya hanya cocok jika dapat dibagi dua, dan dalam hal ini 0sebaliknya menambahkan .
Yang ketiga memeriksa apakah kita kehabisan digit unary, dan jika demikian, lepaskan bantalan untuk meninggalkan digit biner.
Yang terakhir memeriksa apakah tidak pernah ada digit biner yang disediakan, dan dalam kasus itu hanya pergi 0.
Kelompok Regex berikutnya yang kami definisikan adalah untuk mengubah biner kembali menjadi unary, dan sedikit lebih sederhana.
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
Yang pertama dari kelompok ini, B(_*):1/B$1$1_:/seperti halnya antitesisnya, mendeteksi a B, diikuti oleh sejumlah digit Unary, kemudian :1. Itu tidak memeriksa kecocokan Bdalam kasus ini, karena hanya mencari satu digit pada suatu waktu. Jika ini cocok, itu menggandakan jumlah digit unary yang sebelumnya cocok dan menambahkan satu, lalu menghapus satu.
Yang kedua,, B(_*):0/B$1$1:/hampir idendisikal dengan yang pertama, kecuali cocok dengan yang 0bukan 1, dan tidak menambahkan digit unary tambahan.
Yang terakhir ini,, B(_*):B/$1/periksa apakah tidak ada lagi angka biner, dan jika demikian membuka bungkusan yang unary. Tidak seperti antitesisnya, ini tidak memerlukan 0 kasus khusus.
Selanjutnya kita mendefinisikan jregex, yang bertindak sebagai fungsi pemisahan.
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
Yang pertama, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/lakukan sebagian besar angkat berat. Ia mencari j, secara opsional diikuti oleh digit biner yang merupakan "incrementer", kemudian koma diikuti oleh incrementer kemudian tepat 8 digit biner diikuti oleh sisa nomor biner, kemudian a :. Yang pertama dari 8 digit ditambahkan ke incrementer, sehingga menambahnya, lalu semuanya kecuali 8 digit dari input biner ditambahkan setelah :berikut ini a ,. Jadi (Jika kita menggunakan 2 digit, bukan 8) j,1001:akan menjadi j1:1001:,01itu j10:1001,01,11. Selain itu, elemen array yang ditambahkan dibungkus dengan Bs, untuk mengubahnya kembali menjadi unary.
Yang lain, j(\d*),\1\d{0,7}:,?(.*)/,$2,/memeriksa apakah ada kurang dari 8 digit biner yang tersisa untuk memeriksa setelah incrementer, dan jika demikian, menghapus segala sesuatu selain array yang dibungkus dengan ,s. Misalnya.,_,___,
Selama dan setelah pembuatan array, kami mendefinisikan regex perbandingan.
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
Yang pertama, ,((_+)_+),(\2),/,$1,/periksa koma diikuti oleh sejumlah garis bawah, lalu beberapa lagi, diikuti oleh koma, lalu jumlah garis bawah pertama, daripada koma. Kemudian menggantinya dengan jumlah total garis bawah pada elemen pertama yang dikelilingi oleh ,s.
Yang terakhir,, ,(_+),(\1_*),/,$2,/memeriksa koma diikuti oleh sejumlah garis bawah diikuti oleh koma lain, kemudian jumlah yang sama atau lebih garis bawah, dan koma terakhir. Ini sebagai gantinya akan meninggalkan elemen yang tepat.
Akhirnya, ketika ada pada elemen yang tersisa sehingga cocok ^,(_*),$, kami menghapus koma sekitarnya dan mengkonversi kembali ke desimal via d<>. Maka tidak ada lagi regex yang dapat diaktifkan dan hasilnya ditampilkan.
Input awalnya ditempatkan ke dalam template j,b:u<(?#input)>b:, yang pertama-tama mengubah input desimal menjadi unary, misalnya 5-> j,b:_____b:, kemudian unary yang dihasilkan ke biner, j,101:Kemudian membelah biner (yang tidak berfungsi misalnya), mendapatkan elemen terbesar, mengkonversi kembali ke desimal, dan selesai.