Java 7, 725 байт
f(int)( 325 байт ):
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 байт ):
int g(String s){int r=0;for(String i="10";!i.equals(s);i=f(++r));return r;}
Оскільки метод gвикористовує метод fдля обчислення результату, перебираючи можливий список пустот, поки він не знайде той, який дорівнює введеному, байти fпідраховуються вдвічі (оскільки обидва способи повинні мати можливість працювати без іншого для цього завдання).
Пояснення:
Взагалі метод fпросто перетинає всі бінарні рядкові представлення цілих чисел і збільшує лічильник щоразу, коли знайдеться дійсне. Дійсні бінарні рядки для цього виклику відповідають таким правилам: Вони починаються з a 1, а закінчуються з a 0; вони мають рівну кількість 1s і 0s; і кожен раз, коли ви видаляєте перше 1і 0ще раз підтверджуєте те, що залишилося, ці два правила все ще діють. Після того, як лічильник дорівнює вводу, він перетворює цей двійковий-String в список Stid void-list, замінюючи всі 1на [і всі 0на] .
Що стосується методу g: ми починаємо з "[]"(представляє void-list 0), а потім продовжуємо використовувати метод f, збільшуючи ціле число, до тих пір, поки воно не збігатиметься з 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`
Приклади випадків введення та виведення:
Спробуйте тут. (ПРИМІТКА. Останні кілька тестових випадків досить повільні. На всі вони знадобиться приблизно 10-15 сек.)
0 <-> []
1 <-> [[]]
2 <-> [[][]]
3 <-> [[[]]]
4 <-> [[][][]]
5 <-> [[][[]]]
6 <-> [[[]][]]
7 <-> [[[][]]]
8 <-> [[[[]]]]
9 <-> [[][][][]]
10 <-> [[][][[]]]
11 <-> [[][[]][]]
12 <-> [[][[][]]]
13 <-> [[][[[]]]]
14 <-> [[[]][][]]
50 <-> [[[][[[]]]]]
383 <-> [[[][]][[[][]]]]