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


20

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

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

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

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

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

Примеры:

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

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


2
Могу ли я использовать противоречивые значения, если они все еще соответствуют действительности или ложны?
Эрик Outgolfer

@EriktheOutgolfer Конечно
Okx

@trichoplax Я думаю, что он имеет в виду последовательные подпоследовательности длины> = 1.
Эрик Аутгольфер

@EriktheOutgolfer "подряд" было словом, которое я пропустил. Спасибо - теперь это имеет смысл.
Trichoplax

Можем ли мы вывести 1 для фальси и 0 для правды?
Kritixi Lithos

Ответы:




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__~~___]

Разве это не требует, чтобы повторяющиеся подсегменты строки были смежными?
DavidC

1
@ Светлана, ты прав! Я не учел abcab-> 0.
DavidC

1
StringContainsQ[x__~~x__]и !StringFreeQ[#,x__~~x__]&оба короче.
ngenisis


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

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для проверки подстрок и поэтому может быть адаптирован к другим языкам.


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




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
  /
}

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.


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

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» выход , так что вы можете видеть , что это массив , содержащий одну строку.
Лохматый

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.