एक स्ट्रिंग के रन की गणना करें


11

डब्ल्यू रिटर द्वारा एक स्ट्रिंग में रन की संख्या से ली गई निम्नलिखित परिभाषाओं पर विचार करें । ध्यान दें कि शब्द, स्ट्रिंग और सबस्ट्रिंग सभी लगभग समानार्थी शब्द हैं।

एक स्ट्रिंग में रन एक नॉनटेक्स्टेबल (समान न्यूनतम अवधि के साथ) एक स्ट्रिंग में आवधिक खंड है।

शब्द w की एक अवधि पी किसी भी सकारात्मक पूर्णांक है जैसे कि w [i] = w [i + p] जब भी इस समीकरण के दोनों पक्ष परिभाषित होते हैं। चलो प्रति (डब्ल्यू) डब्ल्यू की सबसे छोटी अवधि के आकार को दर्शाते हैं। हम कहते हैं कि एक शब्द w आवधिक iff प्रति (w) <= | w | / 2 है।

उदाहरण के लिए, स्ट्रिंग पर विचार करें x = abcabper(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) द्वारा w के रनों के सेट का निरूपण।

उदाहरण

के चार रन atattattहैं [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tattatt।

स्ट्रिंग aabaabaaaacaacacमें निम्नलिखित 7 रन शामिल हैं:

[१,२] = आ, [४,५] = आ, [],१०] = आआआ,, [१२,१३] = आ, [१३,१६] = बबूल, [१,]] = औराबा, [९ , 15] = अनाका।

आपका आउटपुट रनों की एक सूची होनी चाहिए। प्रत्येक रन को उस अंतराल को निर्दिष्ट करना चाहिए जो उसका प्रतिनिधित्व करता है, लेकिन खुद को प्रतिस्थापित करने की आवश्यकता नहीं है। सटीक स्वरूपण आपके लिए सुविधाजनक हो सकता है।

उदाहरण 1-अनुक्रमण का उपयोग करते हैं, लेकिन आप इसके बजाय 0-अनुक्रमण का उपयोग करने के लिए स्वतंत्र हैं यदि यह अधिक सुविधाजनक है।

टास्क

कोड लिखें जो एक स्ट्रिंग w, आउटपुट RUNS (w) दिया।

भाषा और इनपुट

आप अपनी पसंद की किसी भी भाषा का उपयोग कर सकते हैं और इनपुट स्ट्रिंग को उस रूप में ले सकते हैं जो सबसे सुविधाजनक है। हालाँकि आपको एक पूरा कार्यक्रम देना चाहिए और आपको उदाहरण इनपुट पर चल रहे अपने कोड का उदाहरण दिखाना चाहिए।


4
अच्छी चुनौती है, लेकिन क्या डिफ़ॉल्ट को खत्म करने और कार्यों को अस्वीकार करने का एक अच्छा कारण है ?
मार्टिन एंडर

@MartinEnder यह सिर्फ मेरी प्राथमिकता है। यह लोगों के लिए कोड को कॉपी और पेस्ट करना आसान बनाता है और इसे स्वयं आज़माएं जो बदले में अधिक लोगों के लिए उत्तरों को अधिक दिलचस्प बनाता है।

4
लेकिन इससे बहुत सारे ओवरहेड कोड का भी कारण बनता है, जो एक क्रिया सिंटेक्स के साथ भाषाओं के लिए प्रतियोगिता को अनुचित बनाता है। मैं उदाहरण के लिए जावा में गोल्फिंग नहीं करूंगा अगर मुझे class A{public static ...}हर बार लिखना पड़े तो मैं गोल्फ कोड चाहता था
बैसड्रॉप कंबरवुबवब

@BassdropCumberwubwubwub मैं देख सकता हूं कि पेशेवरों और विपक्ष हैं। मैं पेशेवरों को अधिक मजबूती से तौलने के लिए होता हूं। मुझे लगता है कि उदाहरण के लिए एपीएल की तुलना पायथन से करने के बजाय किसी भी मामले में समान भाषाओं में गोल्फ के जवाब की लंबाई की तुलना करना सबसे दिलचस्प है।

"एक रन अधिकतम होता है यदि यह किसी भी बड़े रन के भीतर पूरी तरह से निहित नहीं है" लेकिन आपके पहले उदाहरण में, [7,8] पूरी तरह से [2,8] के भीतर समाहित है। या क्या आप ऐसे रन के बारे में कड़ाई से बात कर रहे हैं जो समान प्रतिस्थापन को दोहराते हैं?
एडित्सू ने छोड़ दिया क्योंकि SE 16:46 पर EVIL

जवाबों:


2

पायथ, 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]] मिलता है। क्या [3,5] "tt" का प्रतिनिधित्व करता है? यह बहुत अच्छा होगा यदि आप उच्च स्तर पर आपके द्वारा उपयोग किए गए एल्गोरिदम की व्याख्या कर सकते हैं।

@Lembik हाँ, [i, j](0-अनुक्रमित) वर्णों के बीच टुकड़ा शुरुआती का प्रतिनिधित्व करता है i-1और iऔर पात्रों के बीच समाप्त होने j-1और j। यह पायथ और अधिकांश समझदार भाषाओं में मानक सम्मेलन है, जैसा कि यह होना चाहिए ( यहां और यहां देखें )।
एंडर्स कासोर्ग

महान। क्या आपके समाधान का सहज वर्णन करना संभव है? मैं इसे दुर्भाग्य से आपके कोड विवरण से इंजीनियर रिवर्स नहीं कर सकता।

1
@ लेम्बिक मान लीजिए कि हम अवधि d के रनों की तलाश कर रहे हैं। हमें वे सभी स्थान मिलते हैं जहाँ चरित्र i से मेल खाता है i + d। फिर हम कम से कम लगातार ऐसे स्थानों के रन बनाते हैं। सभी के लिए दोहराएँ। हमें अंत में समर्पण करना होगा क्योंकि वास्तविक अवधि केवल d का भाजक हो सकती है।
एंडर्स कासोर्ग

1

सीजेएम, 66

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

इसे ऑनलाइन आज़माएं

संक्षिप्त विवरण:

एल्गोरिथ्म 4 चरणों में काम करता है (उनमें से पहले 3 आप जिन 3 मुख्य ब्लॉकों का अवलोकन कर सकते हैं):

  1. सभी [लंबाई सूचकांक] जोड़े पाते हैं कि एक डुप्लिकेट सबस्ट्रिंग (जैसे कि एक के रूप में के अनुरूप ए.बी.ए. ए.बी.ए. aaacaacac); ये रन का हिस्सा हैं।
  2. कॉनटेननेट जोड़े जो एक ही रन का हिस्सा हैं, यानी लगातार सूचकांकों और समान लंबाई / अवधि।
  3. न्यूनतम सूचकांक और अधिकतम सूचकांक + 2 * लंबाई - 1 लेकर वास्तविक रन का निर्माण करें।
  4. अंत में, डुप्लिकेट किए गए रन को हटा दें (जो एक अलग अवधि के साथ प्राप्त किए गए समान अंतराल हैं)

मैं इसे और अधिक करना चाहता हूं, इसलिए यह सब परिवर्तन के अधीन है।


इसके लिए शुक्रिया। क्या आप उस एल्गोरिथ्म की व्याख्या कर सकते हैं जिसका आपने बहुत उपयोग किया है?

1
@ लेम्बिक ओके, अपडेटेड
एडिट्स ने छोड़ दिया क्योंकि एसई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.