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;}
Karena metode gmenggunakan metode funtuk menghitung hasilnya dengan mengulangi daftar kosong yang mungkin sampai menemukan yang sama dengan yang diinput, byte fdihitung dua kali (karena kedua metode harus dapat berjalan tanpa yang lain untuk tantangan ini).
Penjelasan:
Secara umum, metode fhanya mengulangi semua representasi String biner dari bilangan bulat, dan menambah penghitung setiap kali ditemukan valid. String biner yang valid untuk tantangan ini mematuhi aturan berikut: Mereka mulai dengan a 1, dan diakhiri dengan a 0; mereka memiliki jumlah 1s dan 0s yang sama; dan setiap kali Anda menghapus pertama 1dan 0dan memvalidasi apa yang tersisa lagi, dua aturan ini masih berlaku. Setelah penghitung sama dengan input, itu mengkonversi biner-String ke daftar string-kosong, dengan mengganti semua 1dengan [dan semua 0dengan ].
Adapun metode g: Kita mulai dengan "[]"(mewakili void-list 0), dan kemudian melanjutkan menggunakan metode fsambil meningkatkan integer, sampai cocok dengan input-String.
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`
Contoh input & output kasus:
Coba di sini. (CATATAN: Cukup lambat untuk beberapa kasus uji terakhir. Akan memakan waktu sekitar 10-15 detik untuk semuanya).
0 <-> []
1 <-> [[]]
2 <-> [[][]]
3 <-> [[[]]]
4 <-> [[][][]]
5 <-> [[][[]]]
6 <-> [[[]][]]
7 <-> [[[][]]]
8 <-> [[[[]]]]
9 <-> [[][][][]]
10 <-> [[][][[]]]
11 <-> [[][[]][]]
12 <-> [[][[][]]]
13 <-> [[][[[]]]]
14 <-> [[[]][][]]
50 <-> [[[][[[]]]]]
383 <-> [[[][]][[[][]]]]