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
, f
sonucunu hesaplamak için, girilene eşit olanı buluncaya kadar olası boşluk listesinin üzerinden geçerek sonucunu kullandığı için, bayt f
iki 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 f
sadece 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 1
ile biter 0
; eşit sayıda 1 ve 0'a sahiptirler; ve ilk çıkardığınızda 1
ve 0
tekrar 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 1
ile [
ve tüm 0
ile ]
.
Yönteme gelince g
: "[]"
(boşluk listesini temsil eden 0
) ile başlıyoruz ve daha sonra f
bir 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 <-> [[[][]][[[][]]]]