Nhắc lại theo tôi!


23

Đưa ra một chuỗi làm đối số, xuất độ dài của (các) chuỗi con lặp lại không chồng chéo dài nhất (s) hoặc 0 nếu không có chuỗi đó.

Bạn có thể giả sử chuỗi đầu vào không trống.

Ví dụ

abcdefabc: chuỗi con abcđược lặp lại ở vị trí 1 và 7, vì vậy chương trình sẽ xuất 3

abcabcabcabcab: abcabcHay bcabcahay cabcabđược lặp đi lặp lại, vì vậy chương trình nên sản lượng 6 . (chuỗi con abcabcabcabcũng được lặp lại, nhưng các lần xuất hiện trùng nhau, vì vậy chúng tôi không chấp nhận nó).

aaaaaaa: aaađược lặp lại ở vị trí 1 và 4 chẳng hạn, vì vậy chương trình sẽ xuất 3

abcda: ađược lặp lại, vì vậy chương trình sẽ xuất 1

xyz: không có chuỗi lặp lại → 0

ababcabcabcabcab: nên trả lại 6

Đây là , vì vậy ít byte nhất sẽ thắng.


1
Chuỗi có thể trống? Nếu đó là trường hợp, nó sẽ được phép xuất sai chứ không phải 0 ?
Dennis

@Dennis Bạn có thể giả sử chuỗi không trống.
Arnaud

Câu trả lời:


9

Brainfuck, 226 byte

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

Định dạng:

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

Yêu cầu đầu vào có hoặc không có dòng mới, và đưa ra kết quả dưới dạng giá trị byte .

Hãy thử trực tuyến.

Điều này kiểm tra từng tiền tố để xem liệu nó có xuất hiện sau chuỗi hay không, sau đó loại bỏ ký tự đầu tiên và lặp lại quy trình cho đến khi không còn ký tự nào nữa.

Băng được chia thành các nút 3 ô,

c 0 f

trong đó clà một ký tự của chuỗi đã cho và flà một cờ có thể là một, một số âm hoặc bằng không. Các cờ khác không được đặt giữa hai ký tự hiện đang được so sánh và các ký tự phủ định được dành riêng cho các ô sau khi kết thúc tiền tố hiện tại và trước khi bắt đầu hậu tố hiện tại (nghĩa là trước chỉ số của kết quả khớp tiềm năng hiện tại).

Kết quả được lưu trữ ở bên trái của chuỗi và được cập nhật bất cứ khi nào tìm thấy kết quả khớp.

(Chuỗi thực sự được xử lý ngược lại với phần được \x01nối với nó.)


6

Thạch , 12 byte

œ-QL€
ŒṖÇ€FṀ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ŒṖÇ€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
Tất cả mưa đá Jelly, ngôn ngữ golf mã cuối cùng!
Nissa

œ-Qthực sự gọn gàng.
Lynn

5

Perl 6 , 36 byte

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

Thử nó

Mở rộng:

{   # 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

Võng mạc , 35 32 30 byte

Thử thách khá tuyệt.

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

Dùng thử trực tuyến

Giải trình:

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

Bạn có thể lưu hai byte bằng cách sử dụng M%`.làm giai đoạn thứ hai.
Martin Ender

4

JavaScript (ES6), 79 68 66 byte

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>

Chỉnh sửa: Đã lưu 11 13 byte nhờ @Arnauld.


4

Haskell , 79 byte

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

Hãy thử trực tuyến!


2
Dường như đối số đầu tiên của %thể tích lũy một dãy con không tiếp giáp, cho dương tính giả như 2 cho aatrong axayaa,
XNOR

Những gì @xnor nói. Tôi nghĩ rằng cuộc gọi đệ quy a%dlà sai, nhưng cũng không cần thiết. Điều đó cũng có nghĩa là bạn có thể sử dụng maxthay vì maximum.
Ørjan Johansen

1
Tôi nghĩ thay đổi a%dđể ""%dsửa nó.
xnor

Ồ đúng rồi, nó vẫn cần (và âm thanh) khi atrống.
Ørjan Johansen

1
Tôi nghĩ rằng sum[1|(x,y)<-zip a c,x==y]có thể được sử dụng thay vì a!c.
Laikoni


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

Husk , 11 byte

L►L§fo↓2`xQ

Hãy thử trực tuyến!

Lưu ý: Husk mới hơn thử thách này.

Giải trình

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

Toán học, 75 65 byte

10 byte được lưu do @JingHwan Min .

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

Chức năng ẩn danh. Lấy một chuỗi làm đầu vào và trả về một số làm đầu ra.


Tôi không nghĩ rằng bạn cần bắt đầu và kết thúc BlankNullSequence (___)khi Overlaps->Allcó. Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&sẽ tốt thôi
JungHwan Min

@JungHwanMin Cảm ơn, đã nhầm lẫn với StringReplace: P
LegionMammal978


1

Clojure, 112 byte

#(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)))))

các vòng lặp hai lần so với các số 0đến n - 1( nlà độ dài của chuỗi), thả các jký tự và chia phần còn lại thành các phần "bắt đầu" và "kết thúc". Tạo một tập hợp tất cả các chuỗi con ecó độ dài bvà sử dụng nó như một hàm để kiểm tra xem có bđược tìm thấy từ đó không. Trả về độ dài bnếu tìm thấy và 0 nếu không, trả về giá trị tối đa của các giá trị này.

Sẽ rất thú vị khi xem một phiên bản ngắn hơn.


1

Võng mạc , 24 byte

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

Hãy thử trực tuyến!

Một khởi động để tôi tìm hiểu các tính năng mới của Retina 1.

Giải trình

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

Giai đoạn Danh sách, điều này trả về tất cả các kết quả khớp cho biểu thức chính quy (.*).*\1, phù hợp với bất kỳ mẫu nào có dạng "ABA", trong đó A và B là hai chuỗi con tùy ý (có thể trống). Các tùy chọn bổ sung được đưa ra cho giai đoạn này là v, xem xét các trận đấu chồng chéo và $áp dụng thay thế cho từng trận đấu trước khi trả lại: sự thay thế được chỉ định trong dòng thứ hai và tương ứng với độ dài ( .) của nhóm bắt giữ đầu tiên ( đó sẽ là chuỗi con "A" trong ví dụ trước).

N`

Bây giờ chúng ta có tất cả các độ dài của các chuỗi con lặp đi lặp lại, giai đoạn này chỉ đơn giản là sắp xếp chúng theo thứ tự số, từ ngắn nhất đến dài nhất.

G-1`

Cuối cùng, giai đoạn grep ( G) này chỉ giữ -1kết quả ( ) cuối cùng , là độ dài của chuỗi con lặp lại dài nhất.


0

Javascript, 165 byte

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}

Các trường hợp thử nghiệm

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
Chào mừng bạn đến với Câu đố lập trình & Code Golf. Thật không may, điều này trả về 2 cho đầu vào ababcabcabcabcab, nhưng chuỗi cabcabđược lặp lại.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.