พูดตามฉัน!


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 คุณสามารถสันนิษฐานได้ว่าสตริงนั้นไม่ว่างเปล่า
Arnaud

คำตอบ:


9

brainfuck, 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
เจลลี่ทุกคนเป็นภาษากอล์ฟระดับสุดยอด!
Nissa

œ-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 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%`.เป็นระยะที่สอง
Martin Ender


4

Haskell , 79 ไบต์

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

ลองออนไลน์!


2
ดูเหมือนว่าอาร์กิวเมนต์แรกของ%สามารถสะสม subsequence ไม่ต่อเนื่องกันให้ผลบวกปลอมเช่น 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
Laikoni



2

Husk , 11 ไบต์

L►L§fo↓2`xQ

ลองออนไลน์!

หมายเหตุ: Husk ใหม่กว่าความท้าทายนี้

คำอธิบาย

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

Mathematica, 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

Pyth - 16 ไบต์

ฉันต้องตีกอล์ฟเพื่อเปลี่ยนสายทั้งหมดเป็นความยาวและหาค่าสูงสุด

eSlM+ksmft/dTd./

Test Suite


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

List stage จะส่งคืนการแข่งขันทั้งหมดสำหรับ regex (.*).*\1ซึ่งตรงกับรูปแบบใด ๆ ของแบบฟอร์ม "ABA" โดยที่ A และ B เป็นสองสตริงย่อยโดยพลการ (อาจว่างเปล่า) ตัวเลือกเพิ่มเติมที่มอบให้กับด่านนี้คือvซึ่งพิจารณาการแข่งขันที่ทับซ้อนกันและ$ใช้การทดแทนกับการแข่งขันแต่ละรายการก่อนที่จะส่งคืน: การแทนที่จะถูกระบุในบรรทัดที่สองและสอดคล้องกับความยาว ( .) ของกลุ่มการจับภาพแรก ซึ่งจะเป็นสตริงย่อย "A" ในตัวอย่างก่อนหน้า)

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
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf น่าเสียดายที่ค่านี้ส่งคืน2สำหรับอินพุตababcabcabcabcabแต่สตริงcabcabจะถูกทำซ้ำ
เดนนิส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.