Это повторяется?

20

Строка символов повторяется, если она содержит две последовательные подстроки, которые эквивалентны.

Например, 2034384538452повторяется, поскольку он содержит 3845дважды, последовательно.

Поэтому ваша задача - решить, содержит ли строка повторяющуюся подстроку. Вы можете принять ввод как строку или массив символов.

Вы никогда не получите пустой ввод, и длина подстроки (если она существует) может быть 1 или больше.

Я использую 1и 0здесь в качестве моих истинных и ложных ценностей, но вы можете использовать разные значения, если они правдивы и ложны в вашем языке.

Примеры:

abcab -> 0
bdefdefg -> 1
Hello, World! -> 1
pp.pp/pp -> 1
q -> 0
21020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021012102012101202102012021012102012021020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020120210201210120210201202101210201210120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120 -> 0

(Последний пример был сгенерирован из числа единиц между каждым нулем в последовательности Туэ-Морса)

Okx
источник
2
Могу ли я использовать противоречивые значения, если они все еще соответствуют действительности или ложны?
Эрик Outgolfer
@EriktheOutgolfer Конечно
Okx
@trichoplax Я думаю, что он имеет в виду последовательные подпоследовательности длины> = 1.
Эрик Аутгольфер
@EriktheOutgolfer "подряд" было словом, которое я пропустил. Спасибо - теперь это имеет смысл.
Trichoplax
Можем ли мы вывести 1 для фальси и 0 для правды?
Kritixi Lithos

Ответы:

12

Сетчатка , 6 байт

(.+)\1

Попробуйте онлайн!

Положительное значение для правды; ноль для фальси.

Как это устроено

Возвращает количество совпадений регулярного выражения /(.+)\1/g.

Дрянная Монахиня
источник
7

Желе , 6 5 байт

Ẇµ;"f

Это полная программа. TIO не может обработать последний контрольный пример без его усечения.

Попробуйте онлайн! (последний контрольный пример урезан до 250 цифр)

Как это устроено

Ẇµ;"f  Main link. Argument: s (string)

Ẇ      Words; generate all substrings of s.
 µ     New chain. Argument: A (substring array)
  ;"   Vectorized concatenation; concatenate each substring with itself.
    f  Filter; keep "doubled" substrings that are also substrings.
       This keeps non-empty string iff the output should be truthy, producing
       non-empty output (truthy) in this case and empty output (falsy) otherwise.
Деннис
источник
5

Mathematica, 32 байта

StringMatchQ[___~~x__~~x__~~___]
alephalpha
источник
Разве это не требует, чтобы повторяющиеся подсегменты строки были смежными?
DavidC
1
@ Светлана, ты прав! Я не учел abcab-> 0.
DavidC
1
StringContainsQ[x__~~x__]и !StringFreeQ[#,x__~~x__]&оба короче.
ngenisis
5

Java, 27 байт

a->a.matches(".*(.+)\\1.*")

В значительной степени дублирует ответ Retina , но Java никак не становится короче.

Натан Меррилл
источник
5

05AB1E , 5 байтов

Œ2×åZ

Попробуйте онлайн!

Выводит 1 как истинное значение и 0 как ложное значение

объяснение

Œ2×åZ
Œ     # Substrings of input
 2×   # duplicate them (vectorized)
   å  # Is the element in the input? (vectorized)
    Z # Maximum value from list of elements
Datboi
источник
4

Python , 38 байт

import re
re.compile(r'(.+)\1').search

Попробуйте онлайн!

Зевок, регулярное выражение Проверяет, содержит ли строка один или несколько символов, .+за которыми следует та же строка, которая была только что захвачена. Выходной объект поиска - Truthy, если есть хотя бы одно совпадение, что может быть проверено с помощью bool.

Использование compileздесь экономит на написании лямбда:

lambda s:re.search(r'(.+)\1',s)

Python , 54 байта

f=lambda s:s>''and(s in(s*2)[1:-1])|f(s[1:])|f(s[:-1])

Попробуйте онлайн!

Ищет подстроку, которая состоит из двух или более равных строк, объединенных, как проверено, s in(s*2)[1:-1]как в этом ответе . Подстроки генерируются рекурсивно, выбирая вырезать первый или последний символ. Это экспоненциально, поэтому время ожидания для большого контрольного примера истекло.

Недостатки:

f=lambda s,p='':s and(s==p)*s+f(s[1:],p+s[0])+f(s[:-1])
f=lambda s,i=1:s[i:]and(2*s[:i]in s)*s+f(s[1:])+f(s,i+1)

Первый не использует Python inдля проверки подстрок и поэтому может быть адаптирован к другим языкам.

XNOR
источник
4

Pyth - 10 9 8 байт

f}+TTQ.:

Возвращает список всех повторяющихся подстрок (который, если их нет, является пустым списком, что ложно)

Попытайся

Объяснение:

f}+TTQ.:
      .:    # All substrings of the input (implicit):
f           # filter the list of substrings T by whether...
  +TT       # ...the concatenation of the substring with itself...
 }   Q      # ...is a substring of the input
Мария
источник
1
Если вы предполагаете, что ввод в кавычках f}+TTQ.:работает на 1 байт меньше: ссылка
KarlKastor
3

Чеддер , 60 байт

n->(|>n.len).any(i->(|>i).any(j->n.index(n.slice(j,i)*2)+1))

Попробуйте онлайн!

Дрянная Монахиня
источник
Вы можете @.test(/(.+)\1/)
играть в
@ Downgoat Вы должны просто представить это как другой ответ, действительно.
Утренняя монахиня
2

Perl 6 , 11 байт

{?/(.+)$0/}

Проверь это

Expanded:

{        # bare block lambda with implicit parameter 「$_」

  ?      # Boolify the following
         # (need something here so it runs the regex instead of returning it)

  /      # a regex that implicitly matches against 「$_」
    (.+) # one or more characters stored in $0
     $0  # that string of characters again
  /
}
Брэд Гилберт b2gills
источник
2

PHP, 32 байта

<?=preg_match('#(.+)\1#',$argn);

Беги как труба с -F. Извини, Йорг, я не заметил, что ты написал то же самое .

версия без регулярных выражений, 84 82 байта

    for($s=$argn;++$e;)for($i=0;~$s[$i];)substr($s,$i,$e)==substr($s,$e+$i++,$e)&&die

выход с кодом возврата 0для повторения, тайм-аут (и выход с ошибкой) для отсутствия. Беги как труба с -nr.
предполагает ввод ASCII для печати; заменить ~с a&любой ASCII.

Titus
источник
1

JavaScript (ES6), 19 байт

s=>/(.+)\1/.test(s)
мохнатый
источник
Как насчет /(.+)\1/.test?
Люк
Это то, что у меня есть, @Luke.
Лохматый
@ Shaggy Я полагаю, он подразумевает /(.+)\1/.testсебя как полное представление.
Утренняя монахиня
@Luke /(.+)\1/.testне связан (не имеет this). f=/(.+)\1/.test;f('aa')не сработает, например. Вам нужно будет/./.test.bind(/(.+)\1/)
Artyer
Вы можете ::/(.+)\1/.test
Downgoat
1

V , 6 байтов

ø¨.«©±

Попробуйте онлайн!

Тестирование!

Программа выводит 0для значений Falsey и положительное целое для положительных значений.

(Обратите внимание, что была небольшая ошибка, поэтому мне пришлось набрать 1 байт. Теперь, после исправления, я смогу заменить на\x82 )

объяснение

ø                     " This is a recent addition to V. This command takes in a regex
                      " and replaces the line with the number of matches of the regex
 ¨.«©±                " The compressed regex. This decompresses to \(.\+\)\1
Kritixi Lithos
источник
1

Japt, 8 + 1 = 9 8 байт

f"(.+)%1

Попробуйте онлайн . Выходы nullдля ложных данных и массив, содержащий все повторяющиеся строки для правдивых.

объяснение

 f"(.+)%1
Uf"(.+)%1" # Implicit input and string termination
Uf         # Find in the input
  "(.+)%1" #   a sequence followed by itself
 f         # and return the matched substring
           # output the return value
Люк
источник
Допустимы несогласованные выходные значения, поэтому вы можете использовать, èчтобы вернуть количество совпадений и сбросить флаг.
Лохматый
Да. Я также мог бы просто сбросить флаг, чтобы вернуть само совпадение, так как совпадение не возвращается null, что ложно.
Люк
Для ввода 00он выводит 00. Вы уверены, что это правда в Джапте?
Okx
@Okx Строка "00"есть.
ETHproductions
@Okx; попробуй это . В -Qфлаг «prettyprints» выход , так что вы можете видеть , что это массив , содержащий одну строку.
Лохматый