回答:
編集:再帰(NestWhile
)を使用した完全な書き換え。はるかに速く、無駄な作業はありません。
コード
g@n_:=StringTake[NestWhile[#~StringReplace~{"A"-> "ABCBACBCABCBA","B"-> "BCACBACABCACB",
"C"->"CABACBABCABAC"}&,"ABC",StringLength[#]<n&],n]
使用法
100万文字の3進数の正方形のフリーワードを生成するには、約1/40秒かかります。
g[10]
g[53]
g[506]
AbsoluteTiming[g[10^6];]
確認中
f
文字列に正方形がないかどうかをテストします。
f[s_]:=StringFreeQ[s, x__~~x__]
上記の出力と、文字列「CC」が表示される1つのケースを確認します。
f@Out[336]
f@Out[337]
f@Out[338]
f["ABCBACBCABCBABCACBACCABCACBCABACBABCABACBCACBACABCACBA"]
True
True
True
False
exec"x+=[1-y for y in x];"*n
効率を犠牲にして6文字節約できますが、これはゴルフです。