Java 7, 725 byte
f(int)( 325 byte ):
String f(int i){String s="";for(int j=0,e=0;e<i;e+=v(s))s=Integer.toBinaryString(j++);return"["+s.replace("1","[").replace("0","]")+"]";}int v(String s){for(;!s.isEmpty();s=s.replaceFirst("1","").replaceFirst("0",""))if(s.replace("1","").length()!=s.replace("0","").length()|s.charAt(0)<49|s.endsWith("1"))return 0;return 1;}
g(String)( 75 + 325 byte ):
int g(String s){int r=0;for(String i="10";!i.equals(s);i=f(++r));return r;}
Vì phương thức gsử dụng phương thức fđể tính toán kết quả của nó bằng cách lặp qua danh sách void có thể cho đến khi tìm thấy một giá trị bằng với một lần nhập, các byte fđược tính hai lần (vì cả hai phương thức đều có thể chạy mà không có phương thức khác cho thử thách này).
Giải trình:
Nói chung, phương thức fchỉ đơn giản là các vòng lặp trên tất cả các biểu diễn Chuỗi số nguyên của các số nguyên và tăng bộ đếm mỗi khi tìm thấy một số hợp lệ. Chuỗi nhị phân hợp lệ cho thử thách này tuân thủ các quy tắc sau: Chúng bắt đầu bằng a 1và kết thúc bằng a 0; chúng có số lượng bằng 1 và 0 bằng nhau; và mỗi khi bạn loại bỏ đầu tiên 1và 0và xác nhận những gì còn lại một lần nữa, hai quy tắc này vẫn được áp dụng. Sau khi bộ đếm bằng đầu vào, nó chuyển đổi chuỗi nhị phân đó thành danh sách void String, bằng cách thay thế tất cả 1bằng [và tất cả 0bằng ].
Đối với phương thức g: Chúng tôi bắt đầu bằng "[]"(đại diện cho void-list 0), sau đó tiếp tục sử dụng phương thức ftrong khi tăng số nguyên, cho đến khi nó khớp với Chuỗi đầu vào.
String f(int i){ // Method `f` with integer parameter and String return-type
String s=""; // Start with an empty String
for(int j=0,e=0;e<i; // Loop as long as `e` does not equal the input
e+=v(s)) // And append increase integer `e` if String `s` is valid
s=Integer.toBinaryString(j++);
// Change `s` to the next byte-String of integer `j`
// End of loop (implicit / single-line body)
return"["+ // Return the result String encapsulated in "[" and "]"
s.replace("1","[").replace("0","]")+"]";
// after we've replaced all 1s with "[" and all 0s with "]"
} // End of method `f`
int v(String s){ // Separate method with String parameter and integer return-type
for(;!s.isEmpty(); // Loop as long as String `s` isn't empty
s=s.replaceFirst("1","").replaceFirst("0",""))
// After each iteration: Remove the first "1" and "0"
if(s.replace("1","").length()!=s.replace("0","").length()
// If there isn't an equal amount of 1s and 0s
|s.charAt(0)<49 // or the String doesn't start with a 1
|s.endsWith("1")) // or the String doesn't end with a 0
return 0; // Return 0 (String is not valid)
// End of loop (implicit / single-line body)
return 1; // Return 1 (String is valid)
} // End of separate method
int g(String s){ // Method `g` with String parameter and integer return-type
int r=0; // Result integer
for(String i="[]";!i.equals(s);
// Loop as long as `i` does not equal the input String
i=f(++r)); // After each iteration: Set `i` to the next String in line
return r; // Return the result integer
} // End of method `g`
Ví dụ trường hợp đầu vào và đầu ra:
Hãy thử nó ở đây. (LƯU Ý: Nó khá chậm trong vài trường hợp thử nghiệm gần đây. Sẽ mất khoảng 10-15 giây cho tất cả các trường hợp đó.)
0 <-> []
1 <-> [[]]
2 <-> [[][]]
3 <-> [[[]]]
4 <-> [[][][]]
5 <-> [[][[]]]
6 <-> [[[]][]]
7 <-> [[[][]]]
8 <-> [[[[]]]]
9 <-> [[][][][]]
10 <-> [[][][[]]]
11 <-> [[][[]][]]
12 <-> [[][[][]]]
13 <-> [[][[[]]]]
14 <-> [[[]][][]]
50 <-> [[[][[[]]]]]
383 <-> [[[][]][[[][]]]]