Це повторюється?


20

Рядок символів повторюється, якщо він містить дві послідовні підрядки, які є рівнозначними.

Наприклад, 2034384538452повтори, оскільки вони містяться 3845двічі, послідовно.

Тому ваше завдання полягає в тому, щоб визначити, чи містить рядок, що повторюється. Ви можете приймати введення як рядок або масив символів.

Ви ніколи не отримаєте порожній вхід, а довжина підрядки (якщо вона існує) може становити 1 або більше.

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

Приклади:

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

(Останній приклад був згенерований із кількості одиниць між кожним нулем у послідовності Thue-Morse)


2
Чи можу я використовувати суперечливі значення, якщо вони все ще належним чином є фальшивими чи фальсийними?
Ерік Аутгольфер

@EriktheOutgolfer Звичайно
Okx

@trichoplax Я думаю, що він має на увазі послідовності послідовності довжини> = 1.
Ерік Вихідник

@EriktheOutgolfer "послідовно" було словом, яке я пропустив. Дякую - зараз це має ідеальний сенс.
трихоплакс

Чи можемо ми натомість вивести 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

Математика, 32 байти

StringMatchQ[___~~x__~~x__~~___]

Чи не вимагає цього, щоб підрядові рядки, що повторюються, були суміжними?
DavidC

1
@Svetlana, ти прав! Я не брав до уваги abcab-> 0.
DavidC

1
StringContainsQ[x__~~x__]і !StringFreeQ[#,x__~~x__]&обидва коротші.
ngenisis



4

Пітон , 38 байт

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

Спробуйте в Інтернеті!

Яун, виразка. Перевіряє, чи містить рядок рядок одного з декількох символів, .+за яким слідує той самий рядок, який щойно був записаний. Вихідним об'єктом пошуку є Truthy, якщо є принаймні одна відповідність, як це можна перевірити bool.

Використання compileтут заощаджує над написанням лямбда:

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

Пітон , 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's 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/}

Перевірте це

Розширено:

{        # 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
покататися на


1

V , 6 байт

ø¨.«©±

Спробуйте в Інтернеті!

Тестовий сюїт!

Програма виводить 0значення фальси, а додатне ціле число для позитивних значень.

(Зверніть увагу , що там була невелика помилка, так що я повинен був отримати 1 байт. Тепер після Bugfix, я зможу замінити з \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для помилки та масив, що містить усі повторювані рядки для truthy.

Пояснення

 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.