ReRegex , 294 275 byte
Đã lưu 19 byte bằng cách sử dụng định nghĩa 'hàm' tốt hơn
Tôi muốn nói rằng điều này là khá tốt cho một ngôn ngữ chỉ Regex.
Lib cơ sở không cho phép chuyển đổi giữa Unary và Decimal (Cần thiết là thông số thách thức nêu rõ thập phân), nhưng không hỗ trợ Binary; Vì vậy, tôi đã phải viết nó như là một phần của tập lệnh thêm 120 byte vào nó.
#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:
Hãy thử trực tuyến!
Theo chế độ cá nhân.
#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:
Các bước
Đầu tiên, chúng tôi nhập thư viện 'cơ sở', cung cấp hai biểu thức chính. Một trong đó chuyển đổi u<numbers>
thành unary. Và một trong đó chuyển đổid<unary_underlines>
trở lại thành số thập phân. Điều này là do thử thách yêu cầu IO trong cơ sở10.
Sau đó, chúng tôi xác định một số regexes chuyển đổi unary thành nhị phân.
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
Đầu tiên, b(\d*):(_*)\2_b/b1$1:$2b/
tìm kiếm b
, tùy ý theo sau bởi một số chữ số nhị phân, sau đó a :
, Sau đó, bất kỳ số lượng gạch chân nào, tiếp theo là cùng một lượng gạch chân chính xác cộng với một, và cuối cùng là một số khácb
.
Sau đó, chúng tôi thay thế b1
bằng chữ số nhị phân từ trước :
và chỉ nửa đầu của dấu gạch dưới và cuối cùng là chữ số cuối cùngb
.
Vì vậy, điều này kiểm tra xem unary không chia hết cho hai hay không, và nếu vậy, hãy thêm 1 vào các chữ số nhị phân của nó, sau đó chia cho nó trừ đi hai.
Cái thứ hai, b(\d*):(_+)\2b/b0$1:$2b/
gần như là ý tưởng, tuy nhiên không kiểm tra thêm _
, có nghĩa là nó chỉ khớp nếu nó chia hết cho hai và trong trường hợp này là một0
thay vào đó thay thế.
Cái thứ ba kiểm tra xem chúng ta có ra các chữ số đơn nhất hay không, và nếu vậy, hãy bỏ phần đệm để chỉ để lại các chữ số nhị phân.
Cái cuối cùng kiểm tra xem có bao giờ có bất kỳ chữ số nhị phân nào được cung cấp không, và trong trường hợp đó chỉ để lại 0
.
Nhóm Regexes tiếp theo mà chúng tôi xác định là chuyển đổi nhị phân trở lại thành đơn nguyên và đơn giản hơn một chút.
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
Đầu tiên của nhóm này, B(_*):1/B$1$1_:/
giống như phản đề của nó, phát hiện a B
, theo sau là bất kỳ số lượng chữ số Unary nào, sau đó :1
. Nó không kiểm tra sự phù hợp B
trong trường hợp này, vì nó chỉ tìm kiếm một chữ số tại một thời điểm. Nếu điều này được khớp, nó sẽ nhân đôi số lượng các chữ số đơn nguyên được khớp trước đó và thêm một chữ số, sau đó loại bỏ một chữ số.
Cái thứ hai, B(_*):0/B$1$1:/
gần như là ý tưởng của cái thứ nhất, ngoại trừ khớp với một 0
chứ không phải là một1
, và không thêm một chữ số unary bổ sung.
Cuối cùng trong số này, B(_*):B/$1/
kiểm tra nếu không có thêm các chữ số nhị phân, và nếu vậy sẽ hủy bỏ unary. Không giống như phản đề của nó, điều này không cần trường hợp 0 đặc biệt.
Tiếp theo, chúng tôi xác định j
regexes, hoạt động như một chức năng phân tách.
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
Việc đầu tiên, j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
hầu hết các nâng nặng. Nó tìm kiếm j
, tùy ý theo sau là các chữ số nhị phân là "số gia", sau đó là dấu phẩy theo sau là số tăng sau đó chính xác là 8 chữ số nhị phân theo sau là phần còn lại của số nhị phân, sau đó a :
. Đầu tiên trong số 8 chữ số được gắn vào bộ tăng, do đó tăng nó, sau đó mọi thứ trừ 8 chữ số từ đầu vào nhị phân được nối sau :
a ,
. Vì vậy, (Nếu chúng ta sử dụng 2 chữ số thay vì 8) j,1001:
sẽ trở thành j1:1001:,01
sau đó j10:1001,01,11
. Ngoài ra, các phần tử mảng được nối được gói trong B
s, để chuyển đổi chúng thành unary.
Mặt khác, j(\d*),\1\d{0,7}:,?(.*)/,$2,/
kiểm tra nếu có ít hơn 8 chữ số nhị phân còn lại để kiểm tra sau bộ tăng, và nếu vậy, sẽ loại bỏ mọi thứ khác ngoài mảng được bọc trong,
s. Ví dụ.,_,___,
Trong và sau khi tạo mảng, chúng tôi xác định các biểu thức so sánh.
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
Đầu tiên, ,((_+)_+),(\2),/,$1,/
kiểm tra một dấu phẩy theo sau là một số dấu gạch dưới, sau đó một số dấu phẩy, tiếp theo là dấu phẩy, sau đó là dấu phẩy đầu tiên, hơn dấu phẩy. Sau đó, nó thay thế nó bằng tổng số dấu gạch dưới trong phần tử đầu tiên được bao quanh bởi,
s.
Cái sau ,(_+),(\1_*),/,$2,/
kiểm tra một dấu phẩy theo sau là một số dấu gạch dưới tiếp theo là một dấu phẩy khác, sau đó cùng một lượng hoặc nhiều dấu gạch dưới và dấu phẩy cuối cùng. Điều này thay vào đó sẽ để lại các yếu tố đúng.
Cuối cùng, khi có phần tử còn lại do đó khớp ^,(_*),$
, chúng tôi xóa dấu phẩy xung quanh và chuyển trở lại thành số thập phân quad<>
. Sau đó, không có nhiều regex có thể bắn và đầu ra được trình bày.
Đầu vào ban đầu được đặt vào khuôn mẫu j,b:u<(?#input)>b:
, đầu tiên chuyển đổi đầu vào thập phân thành unary, ví dụ 5
-> j,b:_____b:
, sau đó là unary thành nhị phân, sau j,101:
đó tách nhị phân (ví dụ không hoạt động), lấy phần tử lớn nhất, chuyển đổi trở lại số thập phân, và thực hiện.