Java 7, 725 bayt
f(int)( 325 bayt ):
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 bayt ):
int g(String s){int r=0;for(String i="10";!i.equals(s);i=f(++r));return r;}
Yöntem g, fsonucunu hesaplamak için, girilene eşit olanı buluncaya kadar olası boşluk listesinin üzerinden geçerek sonucunu kullandığı için, bayt fiki kez sayılır (çünkü her iki yöntemin de bu zorluk için diğeri olmadan çalışabilmesi gerekir).
Açıklama:
Genel olarak, yöntem fsadece tamsayıların tüm ikili String gösterimleri üzerinde döngü yapar ve geçerli bir sayı bulunduğunda bir sayacı artırır. Bu zorluk için geçerli binary-Strings aşağıdaki kurallara uyar: a ile başlar ve a 1ile biter 0; eşit sayıda 1 ve 0'a sahiptirler; ve ilk çıkardığınızda 1ve 0tekrar kalanları doğruladığınızda, bu iki kural yine de geçerlidir. Sayaç girişi eşittir sonra, tüm değiştirerek, bir dize boşluk-listeye bu ikili-String dönüştürür 1ile [ve tüm 0ile ].
Yönteme gelince g: "[]"(boşluk listesini temsil eden 0) ile başlıyoruz ve daha sonra fbir tamsayıyı arttırırken, giriş-Stringiyle eşleşene kadar yöntemi kullanmaya devam ediyoruz.
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`
Örnek giriş ve çıkış durumları:
Burada dene. (NOT: Son birkaç test durumu için oldukça yavaş. Hepsi için 10-15 saniye sürecek.)
0 <-> []
1 <-> [[]]
2 <-> [[][]]
3 <-> [[[]]]
4 <-> [[][][]]
5 <-> [[][[]]]
6 <-> [[[]][]]
7 <-> [[[][]]]
8 <-> [[[[]]]]
9 <-> [[][][][]]
10 <-> [[][][[]]]
11 <-> [[][[]][]]
12 <-> [[][[][]]]
13 <-> [[][[[]]]]
14 <-> [[[]][][]]
50 <-> [[[][[[]]]]]
383 <-> [[[][]][[[][]]]]