साम्यवादी पदार्थीकरण सामान्यीकरण


13

एक स्ट्रिंग तो टी लंबाई की कश्मीर दिखाई देता है कश्मीर एक स्ट्रिंग में या अधिक बार एस , तो यह है संभावित साम्यवादी । उदाहरण के लिए, 10में 10/10संभावित साम्यवादी है, ऐसा लगता है के लिए 2 बार और लंबाई की है 2 । ध्यान दें कि ये सबस्ट्रिंग ओवरलैप नहीं हो सकते हैं।

एक साम्यवादी परिवर्तन एक है कि इस स्ट्रिंग लेता है टी और प्रत्येक चरित्र चाल टी मैं की टी करने के लिए मैं की घटना टी में एस । इसलिए, पिछले उदाहरण के लिए, साम्यवादी परिवर्तन उपज देगा 1/0; पहली बार की 10जगह 10पहली बार 10मिला, और 0दूसरी बार।

एक साम्यवादी सामान्य एक समारोह है कि ऐसे सभी तार लेता है टी के साथ कश्मीर ≥ 2 और प्रदर्शन एक साम्यवादी परिवर्तन उन पर।

एल्गोरिथ्म पर कुछ विवरण:

  1. सबसे लंबे समय तक वैध तार पर साम्यवादी परिवर्तनों प्रदर्शन टी पहलेटी की पहली घटनाओं को अनुकूल करें
  2. फिर, अगले-सबसे लंबे समय तक तार पर साम्यवादी परिवर्तन करें, फिर अगला-अगला-सबसे लंबा ... आदि।
  3. तब तक दोहराएं जब तक कि स्ट्रिंग में इस तरह के तार मौजूद न हों।

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


आपका काम साम्यवादी सामान्यीकरण को लागू करना है। इनपुट में केवल मुद्रण योग्य ASCII वर्ण (0x20 से 0x7E, टिल्ड के लिए स्थान) शामिल होंगे। आप इस कार्य को हल करने के लिए एक कार्यक्रम या कार्य लिख सकते हैं; इनपुट को STDIN, स्ट्रिंग / चरित्र सरणी तर्क, ARGV से तर्क, आदि से एक पंक्ति के रूप में लिया जा सकता है।

परीक्षण के मामलों

'123' -> '123'
'111' -> '111'
'1111' -> '11'
'ABAB' -> 'AB'
'111111111' -> '111'
'asdasdasd' -> 'asd'
'10/10' -> '1/0'
'100/100+100' -> '1/0+0'
'   +   +   ' -> ' + '
'Hello, hello, dear fellow!' -> 'Hel he, dear feow!' OR 'Heo hl, dear flow!'
'11122333/11122333/11122333' -> '112/13' OR '132/23'

'ababab1ababab' -> 'a1bab'
'1ab2ab3ab4ab5ab6' -> '1a2b3a4b5ab6'

टेस्ट केस का काम किया

प्रारूप 'string', 'substring'प्रतिस्थापन के प्रत्येक चरण पर है। प्रतिस्थापित बिट्स ब्रैकेटेड हैं।

'11[122]333/11[122]333/11[122]333', '122'
'111[333]/112[333]/112[333]', '333'
'1113/11[23]/11[23]', '23'
'11[13]/112/1[13]', '13'
'1[11]/[11]2/13', '11'
'1[/1]12[/1]3', '/1'
'112/13', ''

एक और परीक्षण मामला:

'Hello, hello, dear fellow!', 'llo'
'Hel, hel, dear feow!', 'l,'
'Hel he, dear feow!', ''

संदर्भ कोड (पायथन)

एल्गोरिदम की कल्पना करने के लिए आपको यह उपयोगी लग सकता है।

#!/usr/bin/env python

import re

def repeater(string):
    def repeating_substring(substring):
        return (string.count(substring) == len(substring)) and string.count(substring) > 1

    return repeating_substring

def get_substrings(string):
    j = 1
    a = set()
    while True:
        for i in range(len(string) - j+1):
            a.add(string[i:i+j])
        if j == len(string):
            break
        j += 1
    return list(a)

def replace_each_instance(string, substring):
    assert `string`+',', `substring`
    for i in substring:
        string = re.sub(re.escape(substring), i, string, 1)

    return string


def main(s):
    repeats = repeater(s)
    repeating_substr = filter(repeater(s), get_substrings(s))

    while repeating_substr:
        repeating_substr.sort(lambda x,y: cmp(len(y), len(x)))
        s = replace_each_instance(s, repeating_substr[0])
        repeating_substr = filter(repeater(s), get_substrings(s))

    return s

assert main('123') == '123'
assert main('111') == '111'
assert main('1111') == '11'
assert main('ABAB') == 'AB'
assert main('111111111') == '111'
assert main('asdasdasd') == 'asd'
assert main('10/10') == '1/0'
assert main('100/100+100') == '1/0+0'
assert main('   +   +   ') == ' + '
assert main('Hello, hello, dear fellow!') == 'Hel he, dear feow!'
assert main('11122333/11122333/11122333') == '112/13'

इस चुनौती के मूल विचार को पोस्ट करने के लिए @ ConorO'Brien को धन्यवाद।


टेस्ट मामलों: ababab1ababab,1ab2ab3ab4ab5ab6
Zgarb

कोई बदलाव क्यों नहीं है? abदोनों तारों में कम से कम दो बार होता है।
जर्गर्ब

@Zbb लगता है कि मेरा परीक्षक खराब है, मैं इसे बाद में ठीक करूंगा। हालांकि मैन्युअल रूप से परीक्षण मामलों को ठीक करना।
R

जवाबों:


2

पायथ, 22 बाइट्स

u.xse.iLcGdf>cGTlTt#.:

परीक्षण सूट

वास्तव में यह देखने के लिए कि कार्यक्रम क्या कर रहा है, इसे देखें:

internals

विशेष रूप से, कार्यक्रम हमेशा सबसे लंबे प्रतिस्थापनों के अंतिम-पश्चकपाल प्रतिस्थापन का उपयोग करता है।

स्पष्टीकरण:

u.xse.iLcGdf>cGTlTt#.:
u.xse.iLcGdf>cGTlTt#.:G)GQ    Implicit
u                        Q    Starting with the input, repeat the following
                              until a fixed point is reached.
                    .:G)      Construct all substrings of the current value
                              ordered smallest to largest, front to back.
                  t#          Filter on having more than 1 element.
                              These are the eligible substrings.
           f                  Filter these substrings on
             cGT              Chop the current value on the substring,
            >   lT            Then remove the first len(substring) pieces.
                              The result is nonempty if the substring is
                              one we're looking for. 
                              Chopping gives nonoverlapping occurrences.
     .iL                      Interlace the substrings with
        cGd                   Chop the current value on that substring
   se                         Take the final result, make it a string.
 .x                     G     If there weren't any, the above throws an error,
                              So keep the current value to halt.

4

जावास्क्रिप्ट (ईएस 6), 121 बाइट्स

f=(s,j=2,o,m=s.match(`(.{${j}})(.*\\1){${(j-1)}}`))=>m?f(s,j+1,s.split(m[1]).map((e,i)=>e+(m[1][i]||'')).join``):o?f(o):s

पुनरावर्ती पैटर्न से मेल खाता है:

(.{2})(.*\1){1}  //2 characters, repeated 1 time 
(.{3})(.*\1){2}  //3 characters, repeated 2 times 
(.{4})(.*\1){3}  //4 characters, repeated 3 times 
etc.

… जब तक पैटर्न नहीं मिला। (यह गारंटी देता है कि सबसे लंबे तार को पहले संभाला जाए।)

इसके बाद मैच को विभाजित करके, और मैच के प्रत्येक अक्षर पर जुड़ने के द्वारा अंतिम-पाया पैटर्न पर "साम्यवादी परिवर्तन" करता है। ( mapइस उद्देश्य के लिए उपयोग किया जाता है। बहुत बुरा joinकॉलबैक नहीं लेता है।)

यह आखिरकार इस नए तार पर तब तक टिका रहता है जब तक कि यह साम्यवादी न हो जाए

परीक्षण के मामलों:


1

क्लीन , 420 ... 368 बाइट्स

import StdEnv,StdLib
l=length
%q=any((==)q)
?_[]=[]
?a[(y,x):b]|isPrefixOf a[x:map snd b]=[y: ?a(drop(l a-1)b)]= ?a b
$s=sortBy(\a b=l a>l b)(flatten[[b: $a]\\(a,b)<-map((flip splitAt)s)[0..l s-1]])
f s#i=zip2[0..]s
#r=filter(\b=l(?b i)>=l b&&l b>1)($s)
|r>[]#h=hd r
#t=take(l h)(?h i)
=f[if(%n t)(h!!hd(elemIndices n t))c\\(n,c)<-i|not(%n[u+v\\u<-t,v<-[1..l h-1]])]=s

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


यह उत्तर अमान्य है। यहाँ देखें। इसे बदला जाना चाहिए, परीक्षण के मामलों को देखें।
R

@ रिकर दिलचस्प है, क्योंकि यह संदर्भ समाधान का प्रत्यक्ष बंदरगाह है। जब तक ठीक नहीं हो जाता, तब तक हटाता हूँ।
Οसह

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