মাঝখানে পুনরাবৃত্তি ছাড়া পুনরাবৃত্তি ছাড়াই মূল স্ট্রিংটি সন্ধান করুন


25

কখনও কখনও এটি ঘটে যায় যে একটি বাক্য টাইপ করার সময়, আমি বিভ্রান্ত হয়ে পড়েছি এবং আমি একই শব্দ দুটি দু'বার পর পর দু'বার লিখে লিখি।

অন্যান্য ব্যক্তি যাতে এতে বিরক্ত না হন তা নিশ্চিত করার জন্য , আপনার কাজটি এমন একটি প্রোগ্রাম লেখা যা এই সমস্যার সমাধান করে!

কার্য

একটি ইনপুট স্ট্রিং দেওয়া (যদি এটি আপনার ভাষার জন্য গুরুত্বপূর্ণ, আপনি হওয়া ASCII শুধুমাত্র ইনপুট যে linefeeds ধারণ করে না অনুমান হতে পারে।) str, যে তার মধ্যম একটি সাবস্ট্রিং যে অবিলম্বে পারম্পর্য মধ্যে দুইবার ঘটে কোথাও রয়েছে, এই এক নিদর্শনের সঙ্গে স্ট্রিং আসতে সাবস্ট্রিং সরানো হয়েছে।

একাধিক সম্ভাবনার ক্ষেত্রে, সবচেয়ে সংক্ষিপ্ত উত্তরটি ফিরে আসুন (এটি, দীর্ঘতম পরপর পুনরাবৃত্তি করা সাবস্ট্রিং চয়ন করুন এবং সেটিকে সরিয়ে দিন)।

একাধিক, সমান-দীর্ঘ ধারাবাহিক পুনরাবৃত্তি সাবস্ট্রিংয়ের ক্ষেত্রে, প্রথমটি (অর্থাৎ প্রথম থেকে পিছনে স্ট্রিংয়ের মাধ্যমে পড়ার সময় প্রথমটির মুখোমুখি হওয়া) একটি অপসারণ করুন।

আপনি ধরে নিতে পারেন যে ইনপুটটি সঠিক (অর্থাত্ সর্বদা একটি ক্রমাগত পুনরাবৃত্তি করা সাবস্ট্রিং থাকে), যা এটি গল্ফ করতে সহায়তা করতে পারে।


উদাহরণ

  1. ইনপুট: hello hello world-> আউটপুট: hello world
  2. ইনপুট: foofoo-> আউটপুট: foo। (সুতরাং: হ্যাঁ, স্ট্রিংটিতে কেবল পুনরাবৃত্ত অংশটি দু'বার থাকতে পারে)।
  3. ইনপুট: aaaaa-> আউটপুট aaa:, দীর্ঘতম পুনরাবৃত্তি হিসাবে একটানা সাবস্ট্রিং এখানে aa
  4. ইনপুট: Slartibartfast-> এটি কোনও বৈধ ইনপুট নয়, কারণ এটিতে একটানা পুনরাবৃত্তি করা সাবস্ট্রিং থাকে না, সুতরাং আপনার এই কেসটি পরিচালনা করার দরকার নেই।
  5. ইনপুট: the few the bar-> এটি অন্য একটি অবৈধ ইনপুট, যেহেতু পুনরাবৃত্তি অংশটি অবিলম্বে মূল অংশটি অনুসরণ করা উচিত। এই ক্ষেত্রে, theএবং theএর মধ্যে-অন্য কিছু দ্বারা পৃথক করা হয়েছে, সুতরাং এই ইনপুটটি অবৈধ।
  6. ইনপুট: ababcbc-> আউটপুট: abcbc। দুটি সম্ভাব্য দীর্ঘতম পরপর পুনরাবৃত্তি সাবস্ট্রিং হয় abএবং bcabস্ট্রিংয়ের আগে যেমনটি দেখা গিয়েছিল, এটি সঠিক উত্তর।
  7. ইনপুট: Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo। আউটপুট: Buffalo buffalo buffalo buffalo Buffalo buffalo। (সম্পাদিত প্রতিস্থাপনটি কেস-সংবেদনশীল হওয়া উচিত)।
  8. ইনপুট: Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.-> আউটপুট: Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.। কেবল দীর্ঘতম ধারাবাহিক পুনরাবৃত্তি সাবস্ট্রিং সরানো হয়।

আপনার কোডটি যতটা সম্ভব সংক্ষিপ্ত হওয়া উচিত, যেহেতু এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তরটি জিতে। শুভকামনা!


@ মান্যাটওয়ার্ক প্রথম বাক্যটি নেওয়ার সময়, এটি Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.ইনপুট হিসাবে, আউটপুট হওয়া উচিত Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.। কেবলমাত্র দীর্ঘতম পাওয়া নকলটি সরানো হয়েছে।
কিউকিউই

1
আমি একটি পরীক্ষা যুক্ত করার পরামর্শ দিচ্ছি যাতে দুটি সম্ভাব্য প্রতিস্থাপন রয়েছে, যেখানে দ্বিতীয়টি প্রথমটির চেয়ে দীর্ঘ হয়। আমার সন্দেহ হয় যে বেশিরভাগ উত্তর
সেটির

@ অ্যারোস পরীক্ষার কেস ৮ হ'ল
এটিই

আমি এবং আমার পরীক্ষার কোডটি ভুল না হলে সেখানে কেবলমাত্র একটি পুনরাবৃত্তি স্ট্রিং রয়েছে।
aross

@ আরোস ডাবল pইন আছেhappens
কিউকিউই

উত্তর:



8

রেটিনা , 35 33 বাইট

বাইট গণনাটি আইএসও 8859-1 এনকোডিং ধরেছে।

(?=(.+)(\1.*))
$2¶$`
O$#`
$.&
G1`

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

ব্যাখ্যা

যেহেতু রেজেক্স ইঞ্জিনগুলি বাম থেকে ডানদিকে ম্যাচগুলি সন্ধান করে, অবস্থান নির্বিশেষে দীর্ঘতম ম্যাচটি খুঁজে পাওয়া তুচ্ছ নয়। এটি নেট এর ব্যালেন্সিং গোষ্ঠীগুলির সাথে করা যেতে পারে, তবে ফলাফলটি বরং অপ্রীতিকরভাবে দীর্ঘ হয়:

1`((.)+)\1(?<=(?!.*((?>(?<-2>.)+).+)\3)^.*)
$1

সুতরাং আমি অনুভব করেছি যে আমি অন্যান্য কিছু রেটিনা বৈশিষ্ট্য ব্যবহার করে তা এড়াতে চেষ্টা করব।

(?=(.+)(\1.*))
$2¶$`

আমরা প্রয়োজনীয়ভাবে সমস্ত সম্ভাব্য বিকল্প প্রয়োগ করে শুরু করি , প্রতিটি লাইনে একটি করে। এটি করার জন্য, আমরা ওভারল্যাপিং ম্যাচগুলির অনুমতি দেওয়ার জন্য, একটি ম্যাচের সামনের অবস্থানে (ম্যাচটি নিজেই পরিবর্তে) মেলা করি। এটি আসল রেজেক্সকে তাকাতে হবে by এই দৃষ্টিকোণটি তারপরেই দ্বিতীয় গোষ্ঠীতে আমরা যে নকলটি সরাতে চাইছি তা বাদ দিয়ে অন্য দুটি ক্যাপচার করে দেয় We প্রতিস্থাপিত করা।

শেষে ডুপ্লিকেটটি সরানো সহ প্রতিটি ম্যাচের জন্য আমাদের একটি করে লাইন থাকবে। শেষে কোনও বিকল্প ছাড়াই আবার সম্পূর্ণ ইনপুট আসবে।

এখন যেহেতু আমাদের সমস্ত সম্ভাব্য বিকল্প রয়েছে, আমরা সংক্ষিপ্ত ফলাফল চাই (যা দীর্ঘতম সরানো পুনরাবৃত্তির সাথে মিলে যায়)।

O$#`
$.&

সুতরাং আমরা প্রথমে দৈর্ঘ্য অনুসারে লাইনগুলি সাজান।

G1`

এবং তারপরে আমরা কেবল প্রথম লাইন রাখি।


বাহ, প্রতিস্থাপন কৌশলটি সত্যিই চালাক!
লিও

6

জেলি , 22 19 বাইট

-2 বাইটস ডেনিসকে ধন্যবাদ (কোনও যুক্তি উল্টে যাওয়া এড়ান, সূক্ষ্মভাবে অপ্রয়োজনীয় বৃদ্ধি সরিয়ে দিন)

ẋ2³wȧ+¥J
ẆÇ€LÐṀḢṬœp

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

সম্পূর্ণ প্রোগ্রাম ( ÐṀডায়াডগুলির উপরে সঠিক বাগানের সাথে অভিনয় না করে একটি ত্রুটি পাওয়া গেছে , যা শীঘ্রই ঠিক করা হবে; যদিও আমি নিশ্চিত নই যে এটি সংক্ষিপ্ত কোডের জন্য তৈরি করতে পারে)।

কিভাবে?

ইনপুটটির দীর্ঘতম স্লাইসগুলির মধ্যে প্রথম আবিষ্কার করে যাতে ইনপুটটিতে একটি পুনরাবৃত্তি উপস্থিত থাকে এবং এটি ইনপুট থেকে সরিয়ে দেয়।

ẋ2³wȧ+¥J - Link 1, removal indices for given slice if valid, else 0: slice, x
ẋ2       - repeat x twice, say y
  ³      - program input: s
   w     - index of first occurrence of y in s (1-based) or 0, say i
       J - range(length(x)): [1,2,3,...,length(x)]
      ¥  - last two links as a dyad
    ȧ    -     and (non-vectorising)
     +   -     addition: [1+i,2+i,3+i,...,length(x)+i] or 0
         - note: no need to decrement these since the last index will be the 1st index
         - of the repetition (thanks to Dennis for spotting that!)

ẆÇ€LÐṀḢṬœp - Main link: string, s
Ẇ          - all sublists of s (order is short to long, left to right, e.g. a,b,c,ab,bc,abc)
 Ç€        - call the last link (1) as a monad for €ach
    ÐṀ     - filter by maximal
   L       -     length
      Ḣ    - head: get the first (and hence left-most) one
       Ṭ   - untruth: make a list with 1s at the indexes given and 0s elsewhere
        œp - partition s at truthy indexes of that, throwing away the borders
           - implicit print

6

জাভাস্ক্রিপ্ট (ES6), 81 74 বাইট

f=
s=>s.replace(/(?=(.+)\1)/g,(_,m)=>r=m[r.length]?m:r,r='')&&s.replace(r,'')
<input oninput=o.textContent=f(this.value)><pre id=o>

সম্পাদনা করুন: @ আরনল্ডের m[r.length]কৌশলটি চুরি করে 7 বাইট সংরক্ষণ করা হয়েছে


5

পাওয়ারশেল , 87 বাইট

param($s)([regex](([regex]'(.+)\1'|% *hes $s|sort L*)[-1]|% Gr*|% V*)[1])|% Re* $s '' 1

এটি অনলাইন চেষ্টা করুন! (সমস্ত পরীক্ষার কেস)

ব্যাখ্যা

মূলত ভিতর থেকে শুরু করে, আমরা নির্দিষ্ট স্ট্রিংয়ের জন্য সমস্ত ম্যাচের অবজেক্টগুলি ফিরিয়ে দিতে, রেজেক্সের Matchesসাথে চলি (.+)\1। রেজেক্সগুলি নিজের দ্বারা অনুসরণ করা অক্ষরের কোনও ক্রমের সাথে মেলে।

তারপরে ফলস্বরূপ ম্যাচের বস্তুগুলিকে পাইপ করা sortহয় তাদের Lengthসম্পত্তি অনুসারে বাছাই করতে (ওয়াইল্ডকার্ডে সংক্ষিপ্ত করে)। এটি দৈর্ঘ্যের অনুসারে বাছাই করা মিলগুলির অ্যারেতে ফলাফল করে, আরোহণ, সুতরাং [-1]শেষ উপাদানটি (দীর্ঘতম) পেতে সূচী দিয়ে । এই ম্যাচের মানটি ম্যাচটি যদিও গ্রুপ নয়, তাই এটি পুনরাবৃত্তি অন্তর্ভুক্ত করে, তাই আমরা বৃহত্তম পুনরাবৃত্ত স্ট্রিংটি পেতে গ্রুপ অবজেক্ট ( |% Gr*) এবং তারপরে ( ) এর মানটি পুনরুদ্ধার করি |% V*। বিষয়টি হ'ল গ্রুপ অবজেক্টটি আসলে একটি অ্যারে কারণ গ্রুপ 0 সবসময় ম্যাচ হয় তবে আমি প্রকৃত গ্রুপটি চাই (1), ফলে ফলাফলটি প্রকৃতপক্ষে মান s হয় , সুতরাং দ্বিতীয় উপাদানটি পেতে সূচকে যুক্ত হয় [1]। এই মানটি নিজেই একটি রেজেক্স অবজেক্টে কাস্ট করা হয়Replaceকোনও কিছুর প্রতিস্থাপন না করে পদ্ধতিটিকে মূল স্ট্রিংয়ের বিরুদ্ধে ডাকা হয় এবং কেবল প্রথম ম্যাচটি প্রতিস্থাপন করা হয় ( |% Re* $s '' 1)।


5

হাস্কেল , 101 বাইট

মূল ফাংশনটি হ'ল fএটি গ্রহণ করে এবং ফেরত দেয় a String

l=length
a=splitAt
f s|i<-[0..l s-1]=[p++t|n<-i,(p,(r,t))<-fmap(a$l s-n).(`a`s)<$>i,r==take(l r)t]!!0

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

আমি যখন এই শুরু, আমি আমদানিকৃত Data.Listএবং ব্যবহৃত maximum, tails, initsএবং isPrefixOfএকরকম যে এটি পরিণত হয়েছে। তবে আমি এখনও কেবল 11 বাইট শেভ করতে পেরেছি ...

নোট

  • splitAt/ aপ্রদত্ত সূচকে একটি স্ট্রিং বিভক্ত করে।
  • s ইনপুট স্ট্রিং হয়।
  • iসংখ্যার তালিকাগুলি হ'ল [0 .. length s - 1], খুব বড় সূচক দেওয়া থাকলে শেষ -1দিকে সেই splitAtবিভাজনকে ঘিরে কাজ করা ।
  • nহয় length sমাইনাস বর্তমান দৈর্ঘ্য লক্ষ্য পুনরাবৃত্তি অংশ জন্য, এটা যে উপায় মনোনীত আমরা তালিকা সিনট্যাক্স কমে বাগাড়ম্বরপূর্ণ দুই নম্বর তালিকা এবং / অথবা ব্যবহার করতে হবে না তাই।
  • p, rএবং ইচ্ছাকৃত পুনরাবৃত্ত অংশ সহ তিন tভাগে বিভক্ত । সেখানে ব্যবহার কোন মধ্যবর্তী বিভক্ত জন্য একটি পরিবর্তনশীল এড়ানো।srfmap(,) String Functor
  • !!0 ম্যাচের তালিকার প্রথম উপাদানটি নির্বাচন করে।


4

গণিত, 63 60 59 বাইট

মার্টিন ইন্ডারের কারণে 4 বাইট সংরক্ষণ করা হয়েছে ।

#&@@StringReplaceList[#,a__~~a__->a]~SortBy~{StringLength}&

বেনামে ফাংশন। ইনপুট হিসাবে একটি স্ট্রিং নেয় এবং আউটপুট হিসাবে একটি স্ট্রিং প্রদান করে।


উদাহরণস্বরূপ 6 এ এটি কাজ করে বলে মনে হচ্ছে না - ~SortBy~StringLengthদৈর্ঘ্যগুলি একই রকম হলে স্ট্রিংগুলি বর্ণানুক্রমিকভাবে
গাছ নয়

1
@ LegionMammal978 সংক্ষিপ্ত ফিক্স স্থিতিশীল সাজানোর জন্য একটি তালিকায় রাখা SortByএবং মোড়ানো StringLengthহয়।
মার্টিন এন্ডার

3

জাভাস্ক্রিপ্ট (ES6), 70 বাইট

s=>s.replace(s.match(/(.+)(?=\1)/g).reduce((p,c)=>c[p.length]?c:p),'')

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


ব্যর্থ হয় aaaabaaab, তবে এর দুর্দান্ত ব্যবহার reduce
নীল

2

এটি একটি মন্তব্য হওয়া উচিত, তবে আমার মন্তব্য করার মতো যথেষ্ট খ্যাতি নেই। আমি কেবল @ নীলকে বলতে চাই যে তার কোডটি 77 বাইটে হ্রাস করা যেতে পারে। রেজিজেসে আপনাকে ফরোয়ার্ড আসক্তি ব্যবহার করার দরকার নেই। এখানে হ্রাস করা সংস্করণ:

s=>s.replace(/(.+)\1/g,(_,m)=>(n=m.length)>l&&(l=n,r=m),l=0)&&s.replace(r,'')

2
হ্যালো, এবং পিপিসিজিতে আপনাকে স্বাগতম! আপনি এটি নিজের জাভাস্ক্রিপ্ট উত্তর হিসাবে জমা দিতে পারেন! আপনি যদি চান, আমি আপনার পোস্টটি সম্পাদনা করতে এবং এটি দেখতে কেমন হবে তা আপনাকে দেখাতে পারি।
NoOneIs এখানে

2
ওভারল্যাপিং ম্যাচের ক্ষেত্রে মোকাবেলা করার জন্য আমাকে ফরোয়ার্ড দৃser়তা ব্যবহার করতে হবে। aababআপনার পরামর্শটি ব্যর্থ হয় তার সংক্ষিপ্ততম উদাহরণ।
নীল

0

সি #, 169 বাইট

(s)=>{var x="";for(int i=0;i<s.Length-2;i++){for(int l=1;l<=(s.Length-i)/2;l++){var y=s.Substring(i,l);if(s.Contains(y+y)&l>x.Length)x=y;}}return s.Replace(x+x,x);}

ব্যাখ্যা

(s) => {                // Anonymous function declaration    
    var x = "";         // String to store the longest repeating substring found
    for (int i = 0; i < s.Length - 2; i++) {               // Loop through the input string
        for (int l = 1; l <= (s.Length - i) / 2; l++) {    // Loop through all possible substring lengths
            var y = s.Substring(i, l);
            if (s.Contains(y + y) & l > x.Length) x = y;   // Check if the substring repeats and is longer than any previously found
        }
    }
    return s.Replace(x + x, x);    // Perform the replacement
}

এটি হ'ল ব্রুট-ফোর্স পদ্ধতির: যতক্ষণ না আমরা দীর্ঘতম পুনরাবৃত্তি করার স্ট্রিংটি খুঁজে না পাওয়া যায় ততক্ষণ প্রতিটি সম্ভাব্য স্ট্রিংয়ের চেষ্টা করুন। নিঃসন্দেহে রিজেক্স আরও দক্ষ, তবে সি # তে রেজেক্সের সাথে ডিল করা বেশ ভার্জোজ হতে পারে।


পিপিসিজিতে আপনাকে স্বাগতম! সমস্ত উত্তরের হয় পুরো প্রোগ্রাম বা কলযোগ্য ফাংশন হওয়া দরকার , হার্ডকডযুক্ত ভেরিয়েবলের ইনপুট সহ স্নিপেটগুলি নিশ্চিত নয়। এছাড়াও, দয়া করে আপনি যে সমস্ত কোড অপ্রয়োজনীয় শ্বেতস্পেস সরানো হয়েছে তার সাথে প্রকৃত কোডটি গণনা করুন। আপনি সর্বদা পুরো গল্ফযুক্ত সংস্করণ ছাড়াও ইন্ডেন্টেশনের সাথে আরও পঠনযোগ্য সংস্করণ অন্তর্ভুক্ত করতে পারেন।
মার্টিন এন্ডার

0

পিএইচপি, 84 82 বাইট

দ্রষ্টব্য: আইবিএম -850 এনকোডিং ব্যবহার করে।

for($l=strlen($argn);--$l&&!$r=preg_filter("#(.{0$l})\g-1#",~█╬,$argn,1););echo$r;

এভাবে চালান:

echo 'hello hello world' | php -nR 'for($l=strlen($argn);--$l&&!$r=preg_filter("#(.{0$l})\g-1#",~█╬,$argn,1););echo$r;';echo
> hello world

ব্যাখ্যা

for(
  $l=strlen($argn);   # Set $l to input length.
  --$l   &&           # Decrement $l each iteration until it becomes 0.
  !$r=preg_filter(    # Stop looping when preg_filter has a result
                      # (meaning a successful replace).
    "#(.{0$l})\g-1#", # Find any character, $l times (so the longest
                      # match is tried first), repeated twice.
    ~█╬,              # Replace with $1: first capture group, removing the
                      # duplicate.
    $argn,
    1                 # Only replace 1 match.
  );
);
echo$r;               # Print the result of the (only) successful
                      # search/replace, if any.

বদলান

  • 2 বাইট সংরক্ষণ করা হয়েছে কারণ পুনরাবৃত্ত সাবস্ট্রিংয়ের সর্বনিম্ন দৈর্ঘ্য নেই is
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.