คำนวณการวิ่งของสตริง


11

พิจารณาคำจำกัดความต่อไปนี้ที่นำมาจากจำนวนการเรียกใช้ในสตริงโดย W. Rytter โปรดทราบว่าคำสตริงและสตริงย่อยเป็นคำพ้องความหมายคร่าวๆทั้งหมด

การทำงานในสตริงคือเซ็กเมนต์ที่ไม่มีช่วงเวลา (ที่มีช่วงเวลาน้อยที่สุดเท่ากัน) ในสตริง

จุด p ของคำ w คือเลขจำนวนเต็มบวกใด ๆ เช่น w [i] = w [i + p] เมื่อใดก็ตามที่ทั้งสองข้างของสมการนี้ถูกกำหนด อนุญาตต่อ (w) แทนขนาดของคาบที่เล็กที่สุดของ w เราบอกว่าคำ w คือคาบ iff ต่อ (w) <= | w | / 2

x = abcabสำหรับตัวอย่างพิจารณาสตริง per(abcab) = 3เป็นx[1] = x[1+3] = a, x[2]=x[2+3] = bและไม่มีระยะเวลาที่มีขนาดเล็ก สตริงabcabจึงไม่เป็นระยะ อย่างไรก็ตามสตริงababเป็นระยะตาม (abab) = 2

การรัน (หรือช่วงเวลาสูงสุด) ในสตริง w คือช่วงเวลา [i ... j] กับ j> = i เช่นนั้น

  • w [i ... j] เป็นคำที่มีคาบตามระยะเวลา p = ต่อ (w [i ... j])
  • มันเป็นสูงสุด อย่างเป็นทางการ w [i-1] = w [i-1 + p] และ w [j + 1] = w [j + 1-p] อย่างไม่เป็นทางการไม่สามารถอยู่ในการรันที่ใหญ่ขึ้นในช่วงเวลาเดียวกัน

แสดงโดย RUNS (w) ชุดของ run of w

ตัวอย่าง

การวิ่งสี่ครั้งatattattคือ [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tattatt

สตริงaabaabaaaacaacacมีการรัน 7 ต่อไปนี้:

[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = acac, [1,8] = aabaabaa, [9 , 15] = aacaaca

ผลลัพธ์ของคุณควรเป็นรายการการดำเนินการ การเรียกใช้แต่ละครั้งควรระบุช่วงเวลาที่แสดง แต่ไม่จำเป็นต้องแสดงผลสตริงย่อย การจัดรูปแบบที่แน่นอนอาจเป็นสิ่งที่สะดวกสำหรับคุณ

ตัวอย่างใช้การจัดทำดัชนี 1 แต่คุณมีอิสระที่จะใช้การจัดทำดัชนี 0 แทนหากสะดวกกว่า

งาน

เขียนโค้ดที่กำหนดสตริง w เอาต์พุต RUNS (w)

ภาษาและอินพุต

คุณสามารถใช้ภาษาใดก็ได้ที่คุณชอบและรับสายป้อนข้อมูลในรูปแบบใดก็ได้ที่สะดวกที่สุด คุณต้องให้โปรแกรมเต็มรูปแบบและคุณควรแสดงตัวอย่างรหัสของคุณที่ทำงานบนอินพุตตัวอย่าง


4
ความท้าทายดี แต่มีเหตุผลที่ดีที่จะลบล้างค่าเริ่มต้นและฟังก์ชั่นไม่อนุญาต
Martin Ender

@MartinEnder มันเป็นเพียงการตั้งค่าของฉัน มันทำให้ผู้คนสามารถคัดลอกและวางโค้ดได้ง่ายขึ้นและลองด้วยตัวเองซึ่งจะทำให้คำตอบน่าสนใจมากขึ้นสำหรับผู้คนมากขึ้น

4
แต่นั่นก็ทำให้รหัสค่าใช้จ่ายจำนวนมากซึ่งทำให้การแข่งขันไม่เป็นธรรมสำหรับภาษาที่มีรูปแบบ verbose ฉันจะไม่เล่นกอล์ฟใน Java เช่นถ้าฉันต้องเขียนclass A{public static ...}ทุกครั้งที่ฉันต้องการรหัสกอล์ฟ
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub ฉันเห็นว่ามีข้อดีและข้อเสีย ฉันเกิดขึ้นเพื่อชั่งน้ำหนักข้อดีอย่างยิ่งยิ่งขึ้น ฉันคิดว่ามันน่าสนใจที่สุดที่จะเปรียบเทียบความยาวของคำตอบกอล์ฟในภาษาที่คล้ายกันไม่ว่าในกรณีใด ๆ แทนที่จะเปรียบเทียบ APL กับ Python

"การวิ่งนั้นมากที่สุดถ้ามันไม่ได้ถูกบรรจุอย่างเต็มที่ในการวิ่งที่ใหญ่กว่า" แต่ในตัวอย่างแรกของคุณ [7,8] จะถูกบรรจุภายใน [2,8] หรือคุณกำลังพูดอย่างเคร่งครัดเกี่ยวกับการวิ่งที่ทำซ้ำซับสตริงเดียวกันหรือไม่?
aditsu เลิกเพราะ SE นั้นชั่วร้าย

คำตอบ:


2

Pyth, 38 ไบต์

{smm,hk+ekdfgaFTdcx1xM.ttB+0qVQ>QdZ2Sl

  m                                 SlQ   map for d in [1, …, len(input)]:
                            qVQ>Qd          pairwise equality of input[:-d] and input[d:]
                        tB+0                duplicate this list, prepending 0 to one copy
                      .t          Z         transpose, padding with 0
                    xM                      pairwise xor
                  x1                        find all occurrences of 1
                 c                 2        chop into groups of 2
           f                                filter for groups T such that:
             aFT                              the absolute difference between its elements
            g   d                             is greater than or equal to d
   m                                        map for groups k:
     hk                                       first element
    ,  +ekd                                   pair with the last element plus d
 s                                        concatenate
}                                         deduplicate

ชุดทดสอบ


ฉันได้รับ "[[3, 5], [6, 8], [0, 4], [1, 8]]" จาก "atattatt" [3,5] เป็นตัวแทนของ "tt" หรือไม่ มันจะดีถ้าคุณสามารถอธิบายอัลกอริทึมที่คุณใช้ในระดับสูง

@Lembik ใช่[i, j]หมายถึงชิ้นเริ่มต้นระหว่างตัวละคร (0-จัดทำดัชนี) i-1และiและสิ้นสุดระหว่างตัวละครและj-1 jนี่คือการประชุมมาตรฐานในภาษา Pyth และภาษาที่มีสติมากที่สุดเท่าที่ควร (ดูที่นี่และที่นี่ )
Anders Kaseorg

ยิ่งใหญ่ เป็นไปได้ไหมที่จะอธิบายวิธีแก้ปัญหาของคุณอย่างสังหรณ์ใจ? ฉันไม่สามารถทำวิศวกรรมย้อนกลับจากคำอธิบายรหัสของคุณได้

1
@ Lembik สมมติว่าเรากำลังมองหาระยะเวลาง เราค้นหาตำแหน่งทั้งหมดที่ตัวละคร i ตรงกับตัวละคร i + d จากนั้นเราจะพบสถานที่ทำงานติดต่อกันอย่างน้อย d ทำซ้ำสำหรับทุกคน เราต้องขจัดข้อมูลซ้ำซ้อนในตอนท้ายเพราะช่วงเวลาจริงอาจเป็นเพียงตัวหารของ d
Anders Kaseorg

1

CJam, 66

q:A,2m*{~A>_@)_@<2*@@2*<=},{_2$-2>2,.+={+}&}*]{[_1=\)\0=2*)+]}%_&p

ลองออนไลน์

คำอธิบายสั้น ๆ :

อัลกอริทึมทำงานใน 4 ขั้นตอน (3 ขั้นตอนแรกสอดคล้องกับ 3 บล็อคหลักที่คุณสามารถสังเกตได้):

  1. ค้นหาคู่ [ดัชนีความยาว] ที่สอดคล้องกับสตริงย่อยที่ซ้ำกัน (เช่นaba aba aaacaacac) นี่คือส่วนของการวิ่ง
  2. เชื่อมต่อคู่ที่เป็นส่วนหนึ่งของการรันเดียวกันนั่นคือดัชนีติดต่อกันและความยาว / ระยะเวลาเดียวกัน
  3. สร้างการวิ่งจริงโดยการทำดัชนีขั้นต่ำและดัชนีสูงสุด + 2 * ความยาว - 1
  4. ในตอนท้ายลบการวิ่งที่ซ้ำกัน (ซึ่งเป็นช่วงเวลาเดียวกันที่ได้รับกับช่วงเวลาที่แตกต่างกัน)

ฉันต้องการตีกอล์ฟให้มากกว่านี้ดังนั้นสิ่งนี้อาจเปลี่ยนแปลงได้


ขอบคุณสำหรับสิ่งนี้. คุณช่วยอธิบายอัลกอริทึมที่คุณใช้ด้วยได้ไหม

1
@Lembik ตกลงอัปเดตแล้ว
aditsu ออกเพราะ SE นั้นชั่วร้าย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.