কমিউনিস্ট সাবস্ট্রিং নরমালাইজেশন


13

যদি একটি স্ট্রিং টি এর দৈর্ঘ্যের K কে স্ট্রিং এস-তে K বা একাধিকবার প্রদর্শিত হয় , তবে এটি সম্ভাব্য সাম্যবাদী । উদাহরণস্বরূপ, 10মধ্যে 10/10সম্ভাব্য সাম্যবাদী, কারণ এটি 2 বার প্রদর্শিত হয় এবং দৈর্ঘ্য 2 হয় । নোট করুন যে এই সাবস্ট্রিংগুলি ওভারল্যাপ করতে পারে না।

একজন সাম্যবাদসম্বন্ধীয় রূপান্তর এক যে এই স্ট্রিং লাগে টি এবং প্রতিটি অক্ষর চলে আসে টন আমি এর টি থেকে আমি এর সংঘটন টি মধ্যে এস । সুতরাং, পূর্ববর্তী উদাহরণের জন্য, সাম্যবাদী রূপান্তর লাভ করবে 1/0; প্রথম গৃহস্থালির কাজ 10প্রতিস্থাপিত 10প্রথমবার 10পাওয়া যায়, এবং 0দ্বিতীয় সময়।

একজন সাম্যবাদসম্বন্ধীয় নিয়মমাফিককরণ একটি ফাংশন যে এই ধরনের সব স্ট্রিং লাগে টি দিয়ে কে ≥ 2 এবং সঞ্চালিত একটি সাম্যবাদসম্বন্ধীয় রূপান্তর তাদের উপর।

অ্যালগরিদমের কিছু নির্দিষ্টকরণ:

  1. প্রথমে দীর্ঘতম বৈধ স্ট্রিং টি তে সাম্যবাদী রূপান্তর সম্পাদন করুন । টি এর প্রথম উপস্থিতি পছন্দ করুন ।
  2. তারপরে, পরবর্তী-দীর্ঘতম স্ট্রিংগুলিতে সাম্যবাদী রূপান্তর সম্পাদন করুন, তারপরে পরবর্তী-পরবর্তী-দীর্ঘতম ... ইত্যাদি
  3. স্ট্রিং এ জাতীয় স্ট্রিং উপস্থিত না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।

নোট করুন যে কয়েকটি স্ট্রিং, যেমন পরীক্ষার ক্ষেত্রে "হ্যালো, হ্যালো" উদাহরণকে দুটি ভিন্ন উপায়ে ব্যাখ্যা করা যায়। আপনি টি এরell জন্য ব্যবহার করতে পারেন তবে আপনি এটি ব্যবহার করতে পারেন । এই ক্ষেত্রে, আপনার কোড যে কোনও বিকল্প চয়ন করতে পারে। দেখানো পরীক্ষার কেসটি ব্যবহার করে তবে আপনি আলাদা এবং সমানভাবে বৈধ আউটপুট পেতে পারেন। llollo


আপনার কাজটি কমিউনিস্ট নরমালাইজেশন বাস্তবায়ন করা। ইনপুটটিতে কেবল মুদ্রণযোগ্য ASCII অক্ষর (0x20 থেকে 0x7E, স্থান থেকে টিলডে) থাকবে। এই কাজটি সমাধান করার জন্য আপনি কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন; ইনপুটটি STDIN, স্ট্রিং / চরিত্রের অ্যারে আর্গুমেন্ট, এআরজিভি থেকে আর্গুমেন্ট ইত্যাদি থেকে নেওয়া যেতে পারে line

পরীক্ষার মামলা

'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'

এই চ্যালেঞ্জটির আসল ধারণা পোস্ট করার জন্য @ কনোরো ব্রায়েনকে ধন্যবাদ Thanks


পরীক্ষার বিষয়: ababab1ababab,1ab2ab3ab4ab5ab6
Zgarb

কেন কোন পরিবর্তন নেই? abউভয় স্ট্রিংয়ে কমপক্ষে দুবার ঘটে।
জাগারব

@ জগারব দেখে মনে হচ্ছে আমার পরীক্ষক খারাপ, আমি এটি পরে ঠিক করব। যদিও ম্যানুয়ালি পরীক্ষার কেসগুলি ঠিক করা।
আর

উত্তর:


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

জাভাস্ক্রিপ্ট (ES6), 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

এটি অনলাইন চেষ্টা করুন!


এই উত্তরটি অবৈধ। এখানে দেখো. এটি পরিবর্তন করা উচিত, পরীক্ষার কেসগুলি দেখুন।
আর

@ রিকার আকর্ষণীয়, যেহেতু এটি রেফারেন্স সমাধানের প্রত্যক্ষ বন্দর। এটি স্থির না হওয়া পর্যন্ত আমি মুছব।
4urous

@ রিকার এখনই ঠিক করা হয়েছে।
10urous
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.