Повторюйте за мною!


23

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

Ви можете припустити, що вхідний рядок не порожній.

Приклади

abcdefabc: підрядка abcповторюється в позиціях 1 і 7, тому програма повинна виводити 3

abcabcabcabcab: abcabcАбо bcabcaабо cabcabповторюються, тому програма повинна вивести 6 . (підрядка abcabcabcabтакож повторюється, але події перетинаються, тому ми не приймаємо її).

aaaaaaa: aaaповторюється, наприклад, у позиціях 1 і 4, тому програма повинна виводити 3

abcda: aповторюється, тому програма повинна виводити 1

xyz: немає повторного рядка → 0

ababcabcabcabcab: повинен повернутися 6

Це , тому виграє найменше байтів.


1
Чи може рядок порожній? Якщо це так, чи буде дозволено виводити False, а не 0 ?
Денніс

@Dennis Ви можете припустити, що рядок не порожній.
Арно

Відповіді:


9

мозковий ебать, 226 байт

,[<<<,]+[>>->[[[[>>[>>>]<+<-<[<<<]>>+<-]>[<+>-]>[>>>]<<[>[<+>-]]>[[<+>-]>+[<<<]>
>>-[+>[<<<]<[>+>[->]<<[<]>-]>[<+>>+<-]>>>[>>>]]>>]<]>+[,<<<+]->[<<<]>>>>>+[,+>>>
+]-[>>>]->]<[+<<<]+<<<++[->>>]+>>>->]<[,<<<]<[>>>+<<<-]>+>,>>>]<<.

Відформатовано:

,[<<<,]
+
[
  for each suffix
  >>->
  [
    for each prefix
    [
      for each suffix
      [
        for each char while no mismatch
        [
          >>[>>>]
          <+<-<[<<<]
          > >+<-
        ]
        >[<+>-]
        >[>>>]
        <<
        [
          mismatch
          >[<+>-]
        ]
        >
        [
          [<+>-]
          >+[<<<]
          >>>-
          [
            match
            +>[<<<]
            <
            [
              >+>[->]
              <<[<]
              >-
            ]
            >[<+> >+<-]
            >>>[>>>]
          ]
          >>
        ]
        <
      ]
      >+[,<<<+]
      ->[<<<]
      >>> >>+[,+>>>+]
      -[>>>]
      ->
    ]
    <[+<<<]
    +<<<++[->>>]
    +>>>->
  ]
  <[,<<<]
  <[>>>+<<<-]
  >+>,>>>
]
<<.

Очікує введення з або без закінчення нового рядка та виводить результат у вигляді байтового значення .

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

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

Стрічка розділена на 3-комірні вузли,

c 0 f

де cє символом даного рядка, і fце прапор, який може бути як один, негативний, чи нуль. Ненульові прапори розміщуються між двома символами, які наразі порівнюються, а негативні - зарезервовані для комірок після закінчення поточного префікса та перед початком поточного суфікса (тобто перед індексом поточного потенційного збігу).

Результат зберігається зліва від рядка і оновлюється щоразу, коли буде знайдено збіг.

(Рядок фактично обробляється в зворотному порядку із \x01доданим до нього.)


6

Желе , 12 байт

œ-QL€
ŒṖÇ€FṀ

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

Як це працює

ŒṖÇ€FṀ  Main link. Argument: s (string)

ŒṖ      Generate all partitions of s.
  ǀ    Apply the helper link to each partition.
    F   Flatten the resulting array of lengths.
     Ṁ  Take the maximum.


œ-QL€   Helper link. Argument: P (partition)

  Q     Yield the elements of P, deduplicated.
œ-      Multiset subtraction; remove exactly one occurrence of each string in P.
   L€   Compute the lengths of the remaining strings. 

1
Всі вітайте Jelly, найвищий код мови для гольфу!
Нісса

œ-Qдійсно акуратно.
Лінн

5

Perl 6 , 36 байт

{m:ex/(.*).*$0/.map(*[0].chars).max}

Спробуй це

Розширено:

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

  m           # match ( implicitly against 「$_」
  :exhaustive # every possible way
  /
    (.*)      # any number of characters ( stored in 「$0」 )
    .*
    $0
  /

  .map(

    *\        # the parameter to Whatever lambda
    [0]\      # the value that was in 「$0」 for that match
    .chars    # the number of characters

  ).max

}

5

Сітківка , 35 32 30 байт

Досить класний виклик.

M&!`(.*)(?=.*\1)
M%`.
O#^`
G1`

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

Пояснення:

M&!`(.*)(?=.*\1)    # Prints overlapping greedy substrings occuring more than once
M%`.                # Replace each line with its length
O#^`                # Sort lines by number in reverse
G1`                 # Return the first line

Ви можете зберегти два байти, використовуючи M%`.як другий етап.
Мартін Ендер

4

JavaScript (ES6), 79 68 66 байт

f=(s,r,l=s.match(/(.*).*\1/)[1].length)=>s?f(s.slice(1),l<r?r:l):r
<input oninput=o.textContent=f(this.value)><pre id=o>

Редагувати: Збережено 11 13 байт завдяки @Arnauld.


4

Хаскелл , 79 байт

(""%)
(a:b)!(c:d)|a==c=1+b!d
_!_=0
a%c@(e:d)=maximum[a!c,""%d,(a++[e])%d]
_%_=0

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


2
Схоже, перший аргумент %може нагромадити безперервну послідовність, даючи помилкові позитиви на зразок 2 для aaв axayaa,
xnor

Що сказав @xnor Я вважаю, що рекурсивний заклик a%dнеправильний, але також зайвий. Що також означає, що ви можете використовувати maxзамість цього maximum.
Ørjan Johansen

1
Я думаю, що змінити, a%dщоб ""%dвиправити це.
xnor

О так, все ще потрібно (і звук), коли aпорожній.
Ørjan Johansen

1
Я думаю, що sum[1|(x,y)<-zip a c,x==y]можна використовувати замість цього a!c.
Лайконі


2

JavaScript, 120

function r(a,b,m){return b=-~b,t=a.slice(0,b),n=a.indexOf(t,b),m=b>m&&!~n?m:b,a!=t&&r(a,b,m)||(a?r(a.slice(1),m,m):~-m)}

2

Лушпиння , 11 байт

L►L§fo↓2`xQ

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

Примітка: лушпиння є новішим, ніж ця проблема.

Пояснення

L►L§fo↓2`xQ  Implicit input, say x = "ababc"
          Q  Nonempty substrings: ["a","b","ab",..,"ababc"]
    f        Keep those that satisfy this:
              Take s = "ab" as an example.
   §    `x    Split x along s: ["","","c"]
     o↓2      Drop the first two pieces: ["c"]
              This is truthy (i.e. nonempty).
             Result is ["a","b","ab","a","b","ab"]
 ►L          Take element with maximal length: "ab"
             If the list is empty, "" is used instead.
L            Length: 2


1

Математика, 75 65 байт

10 байт , зекономлені в результаті @JingHwan Мін .

Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&

Анонімна функція. Бере рядок як вхідний і повертає число як вихід.


Я не думаю, що вам потрібно початок і кінець, BlankNullSequence (___)коли вони Overlaps->Allє. Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&було б просто чудово.
JungHwan Min

@JungHwanMin Спасибі, плутали його з StringReplace: P
LegionMammal978


1

Clojure, 112 байт

#(apply max(for[R[(range(count %))]j R i R](let[[b e](split-at i(drop j %))](if((set(partition i 1 e))b)i 0)))))

двічі циклічно перетворює числа 0на n - 1( nце довжина рядка), скидає jсимволи та розбиває залишки на частини "початку" та "кінця". Створює набір усіх підрядків по eдовжині bі використовує його як функцію для перевірки, чи bзнайдено звідти. Повертає довжину, bякщо знайдено, і 0 в іншому випадку, повертає макс цих значень.

Було б цікаво переглянути скорочену версію.


1

Сітківка , 24 байти

L$v`(.*).*\1
$.1
N`
G-1`

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

Розминка для мене для вивчення нових особливостей Retina 1.

Пояснення

L$v`(.*).*\1
$.1

На етапі списку, це повертає всі збіги для регулярного вираження (.*).*\1, які відповідають будь-якому шаблону форми "ABA", де A і B є двома довільними підрядками (можливо, порожніми). Додані додаткові параметри на цьому етапі - vце розгляд збігів, що перекриваються, і $який застосовує заміну до кожного з матчів перед поверненням: заміна вказується у другому рядку та відповідає довжині ( .) першої групи захоплення ( яка була б підряд "А" у попередньому прикладі).

N`

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

G-1`

Нарешті, цей етап grep ( G) зберігає лише останній ( -1) результат, який є довжиною найдовшої повторної підрядки.


0

Javascript, 165 байт

function a(s){var l=s.length/2,z=1,f='';while(z<=l){var t=s.substr(0,z),c=0;for(var i=0;i<s.length;i++){if(s.substr(i,z)===t){c++;if(c>1){f=t}}}z++}return f.length}

Випробування

console.log(a('abcabcabcabc')) // Output 6
console.log(a('xyz'))          // Output 0
console.log(a('aaaaaaa'));     // Output 3
console.log(a('abcdefabc'));   // Output 3

2
Ласкаво просимо до головоломки програмування та коду для гольфу. На жаль, це повертає 2 для введення ababcabcabcabcab, але рядок cabcabповторюється.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.