GNU Пролог, 49 46 байтов
Вероятно, работает и в других вариантах, хотя они не все представляют строки одинаково; Представление GNU Prolog является полезным для этой проблемы.
Неясно, считается ли это использованием регулярных выражений или нет. Он не использует никаких функций, подобных регулярному выражению, но вся семантика языка похожа на семантику регулярного выражения.
Новая версия (использует трюк рекурсии, замеченный в некоторых других ответах):
s(X):-append(A,B,X),(A=B;A\=X,B\=X,s(A),s(B)).
Старая версия:
s(X):-X=[];append(A,B,X),B\=X,append(C,C,A),s(B).
Это предикат (эквивалент функции Пролога) s
, а не полная программа. Используйте это так:
| ?- s("aa").
true ?
yes
| ?- s("aaababbabbabbbababbaabaabaababaaba").
true ?
yes
| ?- s("baababbabaaaab").
no
| ?- s("bbbbbbbbbbbbbbb").
no
Интересная особенность старого решения заключается в том, что если вы спросите переводчика: «Есть ли еще решения?» с помощью использования ;
в true ?
приглашении (вместо того, чтобы спрашивать «есть ли какое-либо решение» путем нажатия возврата в приглашении, как я делал выше), он возвращает «true» количество раз, равное количеству различных способов выражения строки в заданной форме (например, он возвращает «true» дважды с помощью s("aaaa").
, поскольку это может быть проанализировано как (a a)(a a)
или как(aa aa)
).
Программы Prolog часто обратима ( что позволяет , s
чтобы сформировать список строк с заданным свойством). Более старый не (это входит в бесконечный цикл), но это из-за метода игры в гольф, который я использовал, чтобы гарантировать, что C не пуст; если вы переписываете программу для явного указания C как непустого, она генерирует строки вида «aa», «aabb», «aabbcc» и т. д. (Prolog, будучи Prolog, не определяет тождества для символов, которые их делают вверх, просто спецификация, какие символы одинаковы). Более новый генерирует строки вида «aa», «abab», «abcabc» и т. Д .; это бесконечный цикл сам по себе, и, таким образом, он никогда не достигнет точки, в которой он застрянет из-за невозможности обнаружить строку нулевой длины.
ab
?