প্রামিং পুজলস অ্যান্ড কলফ: কনডেন্স অ স্ট্রিং


25

এই সাইটে কিছু সময় ব্যয় করে আমি যতটা সম্ভব সংক্ষিপ্ত হওয়া জিনিস উপভোগ করতে এসেছি। সেই কারণেই আমি সম্প্রতি একাধিকবার একই অক্ষরগুলি যুক্ত স্ট্রিংগুলিতে বিরক্ত হয়েছি। আপনার কাজ হ'ল একটি বিধি বা প্রোগ্রাম লিখুন যা নিম্নলিখিত বিধি অনুসারে প্রদত্ত স্ট্রিংকে ঘনীভূত করে:

  • 0-ঘনীভূতকরণের সাথে শুরু করুন , এটি একই অক্ষরের প্রথম (বামতম) জোড়ার মধ্যে অন্য 0 টি অক্ষরের সাথে সন্ধান করুন। যদি এই জাতীয় জুড়ি পাওয়া যায়, তবে দুটি অক্ষরের একটি অপসারণ করুন এবং অন্য 0-ঘনীকরণের মাধ্যমে অ্যালগরিদম পুনরায় চালু করুন । যদি এরকম কোনও জুড়ি পাওয়া না যায় তবে পরবর্তী পদক্ষেপের সাথে এগিয়ে যান। উদাহরণ:
    programming-C0-> programing
    aabbcc-C0-> abbcc
    test-C0->test

  • তারপরে একটি 1-ঘনত্ব সম্পাদন করুন , এটি হ'ল প্রথম অক্ষরের মধ্যে একই অক্ষরের মধ্যে 1 টি অন্যান্য চরিত্রের সন্ধান করুন। যদি এই জাতীয় জুড়ি পাওয়া যায় তবে তাদের মধ্যে একটি এবং তাদের মধ্যে থাকা সমস্ত অক্ষর মুছে ফেলুন এবং 0-ঘনীভবন দিয়ে পুনরায় আরম্ভ করুন । যদি এরকম কোনও জুড়ি পাওয়া না যায় তবে পরবর্তী পদক্ষেপের সাথে এগিয়ে যান। উদাহরণ:
    abacac-C1-> acac
    java-C1->ja

  • একটি দিয়ে চালিয়ে যান 2-ঘনীভবন এবং তাই A পর্যন্ত উপর এন-ঘনীভবন সঙ্গে এন মূল স্ট্রিং এর দৈর্ঘ্য হচ্ছে, প্রতিটি সময় একটি ঘনীভবন পর পুনরায় চালু করার কিছু অক্ষর সরানো হয়েছে। উদাহরণ:
    programing-সি 2-> praming
    abcdafg-সি 3->afg

ফলস্বরূপ স্ট্রিংকে কনডেন্সড বলা হয় এবং প্রতিটি অক্ষর একবারে অন্তর্ভুক্ত থাকে।


ইনপুট:

মুদ্রণযোগ্য আসকি-অক্ষরগুলির একটি ছোট কেস স্ট্রিং।

আউটপুট:

ঘনীভূত স্ট্রিং উপরে নিয়ম অনুযায়ী।

উদাহরণ:

examples     -> es
programming  -> praming
puzzles      -> puzles
codegolf     -> colf
andromeda    -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun     -> fun
abcdefae     -> abcde

অ্যালগরিদম কীভাবে কাজ করে তা স্পষ্ট করার জন্য বিশদ উদাহরণ:

fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun 
 -C1-> fun -C2-> ... -C8-> fun

abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb 
 -C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb 
 -C1-> ... -C12-> acb

আপনার সমাধানটি যতক্ষণ না আপনার সমাধান এবং অ্যালগরিদম সমস্ত অনুমোদিত ইনপুটগুলির জন্য একই আউটপুট ফেরত দেয় ততক্ষণ উপরে থেকে অ্যালগরিদম প্রয়োগ করতে হবে না। এটি একটি চ্যালেঞ্জ।


সহায়ক স্যান্ডবক্স মন্তব্যের জন্য @ লিনাসকে ধন্যবাদ !


@ মার্টিনএেন্ডার রিলির পরীক্ষার কেসটি এখনও প্রয়োজনীয়, কারণ এটিই কেবলমাত্র আমার রেটিনা দ্রবণে কাজ করে না।
mbomb007

@ mbomb007 আহ, আমি দেখছি। ভাল যুক্তি.
মার্টিন এন্ডার

ইনপুট স্ট্রিং-এ কি কখনও ফাঁকা জায়গাগুলির মতো মুদ্রণযোগ্য অক্ষর থাকবে?
mbomb007

@ mbomb007 না, মুদ্রণযোগ্য আস্কি অক্ষর ধরে নেওয়া ঠিক আছে।
লাইকনি

@ mbomb007 তবে যতদূর আমি জানি, একটি স্থান একটি মুদ্রণযোগ্য আসকি চরিত্র হিসাবে বিবেচিত হয় , যেমন এখানে
লাইকনি

উত্তর:



5

পার্ল, 38 31 30 29 বাইট

এটি অ-গল্ফিং ভাষাগুলি অনেক পিছনে ছেড়ে দেওয়া উচিত ...

-1 জন্য $-[0]ধন্যবাদ রিলে

-1 দাদাকে@{-} ধন্যবাদ জানাতে

এর জন্য +1 অন্তর্ভুক্ত -p

STDIN এ ইনপুট দিন

condense.pl:

#!/usr/bin/perl -p
s/(.)\K.{@{-}}\1// while/./g

এই 27 বাইট সংস্করণটি কাজ করা উচিত তবে এটি পার্স কোনও রেজেক্সে বিভক্ত না হওয়ার কারণে এটি হয় না @-(দেখুন /programming/39521060/why-are-etc-not-interpolated-in-strings )

#!/usr/bin/perl -p
s/(.)\K.{@-}\1// while/./g

@{\@-}অংশটি কীভাবে কাজ করে? আমি ভেবেছিলাম @-প্রতিটি ম্যাচের সূচীগুলি রাখা আছে, সুতরাং এটি প্রতিটি পুনরাবৃত্তিতে কীভাবে "কাউন্ট আপ" করে। এছাড়াও, আপনি যদি @{\@-}প্রতিস্থাপনের আগে এবং পরে মুদ্রণ করেন তবে এটি কেবল কখনও 1 বা 2 টি প্রিন্ট করে
রিলে

1
@ রিলে /./gপ্রতিটি বারে স্ট্রিংটিতে 1 দ্বারা অগ্রগতি হয়, কেবল স্ট্রিং পরিবর্তিত @-হওয়ার পরে, এটি 0 এ পুনরায় সেট করা হয় তবে আপনি যদি এটির পরে মুদ্রণ করেন /./gতবে আপনি এটিটি উপরে যেতে s///দেখবেন (বাকী স্ট্রিং যথেষ্ট বড় যেখানে একটি পরীক্ষা ব্যবহার করুন)
টন হসপেল

মুদ্রণটি $-[0]আমার প্রত্যাশার সংখ্যাগুলি দেয়। কি @{\@-}মত আইন $-[0]যখন কোনো কারণে মুদ্রণ কারণ Regex প্রসঙ্গের কিন্তু না? তারা যদি একই হয় তবে তার $-[0]চেয়ে কম বাইট কম @{\@-}
রিলে

"@{\@-}"@{\@-}(ছাড়া ") হিসাবে একই নয় ।
রিলে

@Riley না, কিন্তু "@{\@-}"হিসাবে একই "@-"। এবং এটি একটি রেজেক্স প্রতিস্থাপনের ক্ষেত্রেও সত্য হওয়া উচিত তবে এটি তা নয়। একযোগে $-[0]কাজ করা উচিত কিন্তু না। পিএস: আপনি সম্ভবত @-নিজের মুদ্রণটি করার সময় কোনওভাবেই স্কেলার প্রসঙ্গটি প্রয়োগ করেছিলেন , তাই আপনি সর্বদা 1 বা 2 পেয়েছিলেন
টন হসপেল

3

সিজেম , 35 বাইট

rL{_,{{(_@_@#I={I)>]sj}*}h]s}fI}j

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


rL{                            }j   | run recursion on input
   _,{                      }fI     | for I from 0 to length(input)
      {                 }h]s        | one pass & clean up
       (_@                          | slice and store leading element A
          _@#I={      }*            | if next A is I steps away
                I)>                 | slice off I+1 element
                   ]sj              | clean up & recursion

আপনি সন্নিবেশ করে পৃথক ঘনীভবন দেখতে পাবেনed


2

পাইথন 2, 117 104 101 বাইট

পুনরাবৃত্তভাবে প্রয়োজনীয় প্রতিস্থাপনগুলি করুন। আমি গতিশীলভাবে রেজেক্স তৈরি করি।

import re
def f(s,i=0):t=re.sub(r"(.)%s\1"%("."*i),r"\1",s);e=s==t;return i>len(t)and t or f(t,i*e+e)

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


দুটি রিটার্ন লাইন return i>len(t) and t or s!=t and f(t) or f(t,i+1)-4 বাইটের জন্য
জড়িত

এটিকে পরিবর্তন করে আরও 2 বাইট return t if i>len(t)else s!=t and f(t)or f(t,i+1))
মুভ

আরও বেশি কিছু e=s==t;return i>len(t)and t or f(t,i*e+e)পরে আপনি i=0ফাংশন সংজ্ঞাটি সরিয়ে ফেলতে পারেন , তবে আপনাকে 0 টি দিয়ে শুরু করতে হবে।
কোয়েলক্লেফ

আমি ধরে নিতে চলেছি যে চারটি স্পেস সেখানে নেই কারণ আপনি চারটি স্পেস ব্যবহার করছেন কিন্তু এসই স্বয়ংক্রিয়ভাবে সেগুলি প্রসারিত করার কারণে। যদি এটি না হয় তবে আপনি আপনার সমস্ত স্পেসটি হয় ট্যাব বা একক স্থান -9 বাইটের জন্য পরিবর্তন করতে পারেন।
ফান্ড মনিকার লসুইট

@ কিউলক্লেফ মেটা অতিরিক্ত পরামিতি গ্রহণ নিষেধ করে।
mbomb007

1

পার্ল 53 52

-P এর জন্য +1 অন্তর্ভুক্ত

for($i=0;$i<length;){$i=(s/(.).{$i}\1/\1/)?0:$i+1;}

আদর্শে এটি চেষ্টা করুন ।


1

গণিত, 101 বাইট

NestWhile[i=0;StringReplace[#,a_~~_~RepeatedNull~i++~~a_:>a,1]&,#,SameQ,2,ByteCount@#]&~FixedPoint~#&

এই খাটো করার একটি উপায় থাকা উচিত ...


1

পিএইচপি, 90 বাইট

for($s=$argv[$c=1];$s[$i=++$i*!$c];)$s=preg_replace("#(.).{{$i}}\\1#","$1",$s,1,$c);echo$s;

বা 92 বাইট

for($s=$argv[1];$s[$i];$i=++$i*!$c)$s=preg_replace("#(.).{".+$i."}\\1#","$1",$s,1,$c);echo$s;   

1
1) প্রথম সংস্করণ: (-2) এর +$iপরিবর্তে $i+=0। 2) এর forপরিবর্তে লুপ whileদুটি বাইট সংরক্ষণ করতে পারে এবং কোঁকড়ানো (-4) অপসারণ করতে দেয়। 3) এর $i=++$i*!$cপরিবর্তে $i=$c?0:$i+1(-1)। 4) \\2প্রয়োজন হয় না, বন্ধনী সরান (-2)। 5) আপনি গতি (+0) এর 9পরিবর্তে সীমাটি অনুমতি দিতে পারবেন1
তিতাস

টাইটাস খুব ভাল ধারণা। আমি এটি আপনাকে ধন্যবাদ
দেখিনি

এখন যে আমি আবার মনে করি ... +$iপ্রতিটি ক্ষেত্রেই কাজ করে না। ব্যবহার করে দেখুন hammer। পিএইচপি রেজেক্সের খালি ধনুর্বন্ধনী সম্পর্কে অভিযোগ করে না; তবে এটি যেমন চেয়েছিল তেমন মেলে না। উপায় দ্বারা: আমি 90 গণনা করছি, 90 নয় But তবে নতুন 1 চেষ্টা করুন)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
টাইটাস

@ টিটাস হ্যাঁ সত্যই আমি ফিরে যাচ্ছি $i+=0এবং পরে আপনার প্রস্তাব চেষ্টা করব। হাতুড়ি দিয়ে কী বোঝাতে চাই?
জার্গ হালসারম্যান 18

@ টিটাস একই সমস্যা ঠিক আছে যদি puzzleবা অন্য কিছু পছন্দ করে (.)//1তবে এটি আপনার প্রস্তাব বা ঠিক আছে$i´=0
জার্গ হালসারম্যান

1

রুবি, 75 64 57 বাইট

(56 বাইট কোড +) p কমান্ড লাইন বিকল্প)

প্রতিস্থাপন করা ম্যাচের দৈর্ঘ্য নিয়ন্ত্রণ করতে একটি রেজেজের অভ্যন্তরে স্ট্রিং ইন্টারপোলেশন ব্যবহার করে।

i=0
~/(.).{#{i}}\1/?sub($&,$1)&&i=0: i+=1while i<$_.size

টেস্ট:

$ ruby -p condense.rb <<< fnabnfun
fun

1

হাস্কেল , 97 88 বাইট

(0?)
(a:s)!(b:t)|a==b=a:t|1<3=a:s!t
s!_=s
m?s|length s<m=s|a<-s!drop m s=sum[m+1|a==s]?a

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


পুরাতন 97 বাইট বিয়ারেশন:

(a:s)!(b:t)|a==b=a:t|1<3=a:s!t
s!_=s
m?s|length s==m=s|a<-s!drop m s=(last$0:[m+1|a==s])?a
c=(0?)

আদর্শে এটি চেষ্টা করুন

ব্যাখ্যা:

(a:s)!(b:t)|a==b = a:t         --perform condensation
           |1<3  = a:s!t       --recursively compare further
 s   ! _         = s           --no condensation performed

(!)কর্ম সঞ্চালিত এক এন-ঘনীভবন যখন একবার পুরো প্রথম এন মুছে অক্ষর, যেমন সঙ্গে একবার একটি স্ট্রিং দেওয়া abcdbeএবং cdbeযাও recursively দুই নেতৃস্থানীয় অক্ষর তুলনা করে একটি 2-ঘনীভবন জন্য।

m?s|length s==m   = s         --stop before performing length-s-condensation
   |a <- s!drop m s           --a is the m-condensation of s
    = (last$0:[m+1|a==s])?a   --disguised conditional:
                              -- if a==s       if the m-condensation did not change s
                              -- then (m+1)?a  then perform m+1-condensation
                              -- else 0?a      else restart with a 0-condensation

c=(0?)                        -- main function, initialise m with 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.