GNU Prolog, 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).
Це предикат (еквівалент функції Prolog), який називається s
, а не повна програма. Використовуйте його так:
| ?- s("aa").
true ?
yes
| ?- s("aaababbabbabbbababbaabaabaababaaba").
true ?
yes
| ?- s("baababbabaaaab").
no
| ?- s("bbbbbbbbbbbbbbb").
no
Цікава особливість старого рішення полягає в тому, що якщо ви запитаєте перекладача, "чи більше рішень?" через використання ;
в тій true ?
рядку (а не питати «є якесь - яке рішення» з допомогою натискання повернення в командному рядку, як я зробив вище), вона повертає «істини» число раз , дорівнює кількості різних способів рядки може бути виражена у даній формі (наприклад, він повертає "true" двічі s("aaaa").
, оскільки це може бути проаналізовано як (a a)(a a)
або як (aa aa)
).
Програми Prolog часто оборотна ( що дозволяє , s
щоб сформувати список рядків із заданою властивістю). Старший - це не (він переходить у нескінченний цикл), але це через метод гольфу, який я використовував, щоб переконатися, що C не порожній; якщо ви перезаписуєте програму, щоб явно вказати C як порожній, вона генерує рядки форми "aa", "aabb", "aabbcc" і так далі (Prolog, будучи Prolog, не визначає ідентичності символів, які їх складають вгору, лише уточнення, які символи однакові). Новіший генерує рядки форми "aa", "abab", "abcabc" тощо; це сам по собі нескінченний цикл, і тому ніколи не потрапляє в точку, в якій він застрягне через невдачу виявити рядок нульової довжини.
ab
?