Mathematica 159 140 134
Sunting : Menulis ulang lengkap, menggunakan rekursi ( NestWhile
). Jauh lebih cepat dan tidak ada usaha yang sia-sia.
Kode
g@n_:=StringTake[NestWhile[#~StringReplace~{"A"-> "ABCBACBCABCBA","B"-> "BCACBACABCACB",
"C"->"CABACBABCABAC"}&,"ABC",StringLength[#]<n&],n]
Pemakaian
Dibutuhkan sekitar 1/40 detik untuk menghasilkan kata bebas terner persegi dengan satu juta karakter.
g[10]
g[53]
g[506]
AbsoluteTiming[g[10^6];]
Memverifikasi
f
akan menguji apakah sebuah string bebas persegi.
f[s_]:=StringFreeQ[s, x__~~x__]
Memeriksa output di atas dan satu case di mana string "CC" muncul.
f@Out[336]
f@Out[337]
f@Out[338]
f["ABCBACBCABCBABCACBACCABCACBCABACBABCABACBCACBACABCACBA"]
Benar
Benar
Benar
Salah
exec"x+=[1-y for y in x];"*n
menghemat 6 karakter dengan mengorbankan efisiensi - tapi hei ini golf!