Mathematica 159 140 134
Редактировать : полное переписывание с использованием рекурсии ( NestWhile
). Намного быстрее и без усилий.
Код
g@n_:=StringTake[NestWhile[#~StringReplace~{"A"-> "ABCBACBCABCBA","B"-> "BCACBACABCACB",
"C"->"CABACBABCABAC"}&,"ABC",StringLength[#]<n&],n]
Применение
Требуется приблизительно 1/40 секунды, чтобы сгенерировать слово без троичного квадрата с одним миллионом символов.
g[10]
g[53]
g[506]
AbsoluteTiming[g[10^6];]

Проверка
f
проверит, является ли строка свободной от квадратов.
f[s_]:=StringFreeQ[s, x__~~x__]
Проверка вышеприведенных выходных данных и один случай, в котором появляется строка «CC».
f@Out[336]
f@Out[337]
f@Out[338]
f["ABCBACBCABCBABCACBACCABCACBCABACBABCABACBCACBACABCACBA"]
Истинно
верно
верно
ложно
exec"x+=[1-y for y in x];"*n
экономит 6 символов за счет эффективности - но эй, это гольф!