রক-পেপার-কাঁচিগুলিতে নিজেকে পুনরাবৃত্তি করবেন না


26

গুজবের পরে যে কোডগল্ফের একটি রক-পেপার-কাঁচি টুর্নামেন্ট থাকবে আপনি স্কোয়ার-মুক্ত শব্দের বিষয়টি অনুসন্ধান করবেন । অক্ষর দিয়ে তৈরি একটি শব্দ R, P, Sহয় বর্গক্ষেত্র-মুক্ত হলে দ্বিগুন পুনরাবৃত্তি একটা ক্রম ধারণ করে না। এই কথাটি বলতে গেলে শব্দটি লেখা যায় না

a x x b

যেখানে aএবং bযে কোন দৈর্ঘ্যের শব্দের এবং xঅন্তত দৈর্ঘ্যের একটি শব্দ এক, চিঠিপত্র সব তৈরি R, P, S

কার্য

একটি প্রোগ্রাম যা উত্পন্ন লিখুন বর্গক্ষেত্র-মুক্ত অক্ষর শব্দের R, P, Sদৈর্ঘ্য nযেখানে সংখ্যাকে 1 <= n <= 10ইনপুট হিসাবে নেওয়া হয়।

উদাহরণ

উদাহরণস্বরূপ বর্গক্ষেত্র-মুক্ত দৈর্ঘ্য 3 শব্দ

RPR, RSR, RPS, RSP, SPS, SRS, SRP, SPR, PRP, PSP, PSR,PRS

এবং দৈর্ঘ্য 4 হয়

RPRS, RPSR, RPSP, RSRP, RSPR, RSPS, PRPS, PRSR, PRSP, PSRP, PSRS, PSPR, SRPR, SRPS, SRSP, SPRP, SPRS,SPSR

এবং নোট করুন যে উদাহরণস্বরূপ SPSPবা PRPRবর্গমুক্ত নয়

বিধি

  • এটি কোডগল্ফ, সংক্ষিপ্ততম প্রোগ্রামের জয়, স্ট্যান্ডার্ড লুফোলগুলি বন্ধ।
  • আপনি শব্দগুলি মুদ্রণ করতে পারেন বা এগুলিকে স্মৃতিতে তৈরি করতে পারেন।
  • আপনার প্রোগ্রাম একটি ফাংশন হিসাবে লেখা যেতে পারে।

তথ্যসূত্র

বর্গমুক্ত শব্দে উইকিপিডিয়া এন্ট্রি

প্রদত্ত দৈর্ঘ্যের বর্গমুক্ত ত্রৈমাসিক শব্দের সংখ্যা https://oeis.org/A006156 এ

সম্পর্কিত: নির্বিচারে-দৈর্ঘ্য টার্নারি স্কোয়ারফ্রি শব্দ


4
এর জন্য একটি পরীক্ষার n>3কেসটি একটি ভাল ধারণা হবে, কারণ পুনরাবৃত্ত অক্ষর বনাম পুনরাবৃত্ত ক্রমগুলি সম্পর্কে কিছু বিভ্রান্তি রয়েছে।
লাইকনি

অনুগ্রহ করে বালির বাক্সে পরিকল্পিত ফলোআপ সম্পর্কে মন্তব্য করুন: কোডগল্ফ.মেটা.স্ট্যাকেক্সেঞ্জাও.এ
এমএসচাউয়ার

6
আমি মনে করি না "প্রাকৃতিক-ভাষা" ট্যাগটি এখানে প্রয়োগ করা উচিত
লিও

1
আহ, "শব্দগুলি" "প্রাকৃতিক-ভাষায়" প্রসারিত হ'ল, আমি এটিকে সরিয়ে দিয়েছি।
mschauer

1
না, এটিতে বর্গাকার এসপি এসপি রয়েছে
এমএসচাউয়ার

উত্তর:


20

রুবি, 39 বাইট

->n{(?P*n..?S*n).grep_v /[^RPS]|(.+)\1/}

এই হাস্যকরভাবে অকার্যকর ফাংশনটি দৈর্ঘ্যের N এর সমস্ত স্ট্রিং উত্পন্ন করে যা এন পি এস এবং এন এস এর মধ্যে বর্ণানুক্রমিকভাবে থাকে, তারপরে বিরাট সংখ্যাগরিষ্ঠকে ফিল্টার করে যা অ আরপিএস অক্ষর ধারণ করে। প্রকৃত squarefree চেক শুধু একটি RegExp backreference ব্যবহার করে: (.+)\1

আরও মুশকিল 65৫ বাইট যা এন = 10 এর জন্য যুক্তিসঙ্গত সময়ের মধ্যে শেষ করে:

->n{%w[R P S].repeated_permutation(n).map(&:join).grep_v /(.+)\1/}

সম্পাদনা: জি বি কে একটি বাইট সংরক্ষণ করে


আপনার গ্রেপ_ভিতে প্রথম বন্ধনী প্রয়োজন নেই, এটির স্ল্যাশের মধ্যে কেবল একটি জায়গা (1 বাইট সংরক্ষণ করুন)
জিবি

6
" হাস্যকরভাবে অদক্ষ " সম্ভবত এই সাইটে বেশ কয়েকটি উত্তর বর্ণনা করে।
মনিকার লসুইট ফান্ড করুন

10

জেলি , 15 14 বাইট

“RPS”ṗẆ;"f$$Ðḟ

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

কিভাবে এটা কাজ করে

“RPS”ṗẆ;"f$$Ðḟ  Main link. Argument: n

“RPS”ṗ          Cartesian power; yield all strings of length n over this alphabet.
            Ðḟ  Filterfalse; keep only strings for which the quicklink to the left 
                returns a falsy result.
           $      Monadic chain. Argument: s (string)
      Ẇ             Window; yield the array A of all substrings of s.
          $         Monadic chain. Argument: A
       ;"             Concatenate all strings in A with themselves.
         f            Filter; yield all results that belong to A as well.

7

রেটিনা , 28 বাইট

+%1`1
R$'¶$`P$'¶$`S
A`(.+)\1

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

ইনপুট লাগে ইউনারী মধ্যে

ব্যাখ্যা

+%1`1
R$'¶$`P$'¶$`S

এটি দৈর্ঘ্যের তৈরি সমস্ত স্ট্রিং উত্পন্ন করে । আমরা এটি করার উপায়টি হ'ল আমরা বারবার প্রতিটি লাইনে প্রথমটি প্রতিস্থাপন করি । এর মত লাইন সম্পর্কে দিন , যেখানে ম্যাচ সামনে সবকিছু এবং খেলা শেষে সবকিছু (তারা এবং যথাক্রমে Regex প্রতিকল্পন সিনট্যাক্স এ, কিন্তু যারা বর্ণন কম স্বজ্ঞাত)। আমরা প্রতিস্থাপন সঙ্গে , যেখানে linefeeds হয়। তাই এই প্রতিকল্পন পূর্ণ ফলাফলের আসলে , যা লাইনের তিন কপি হয়, সঙ্গে প্রতিস্থাপন , , যথাক্রমে, তিন কপি প্রতিটি। এই প্রক্রিয়াটি একবারে সকলের পরিবর্তিত হয়ে যায়।RPSn1<1><>$`$'1R>¶<P>¶<S<R>¶<P>¶<S>1RPS1

A`(.+)\1

পরিশেষে, আমরা সহজেই সমস্ত লাইন ফেলে রাখি যাতে পুনরাবৃত্তি রয়েছে।


আমি বার বার প্রতিস্থাপিত হবে 1(.*)সঙ্গে $1R¶$1P¶$1Sকিন্তু বাইট গোনা একই।
নিল

6

হুশ , 15 14 বাইট

-1 বাইট ধন্যবাদ জাগার্বকে!

fȯεfoE½QΠR"RPS

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

সঠিক দৈর্ঘ্যের সমস্ত সম্ভাব্য ক্রম তৈরি করে এবং কেবলমাত্র তাদের সাবস্ট্রিংগুলি (খালিটি ব্যতীত) দুটি পৃথক অংশ দ্বারা রচিত keeps

অভিশাপ, আমি এখানে জেলিকে সত্যিই মারতে চেয়েছিলাম।


3
জেলির সাথে টাই করতে 14 বাইটস
জগারব


5

জাভা 8, 285 277 বাইট

import java.util.*;Set r=new HashSet();n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)void p(String p,String s,int n){int l=s.length(),i=0;if(l<1&&(s=p.substring(0,n)).equals(s.replaceAll("(.*)\\1","")))r.add(s);for(;i<l;p(p+s.charAt(i),s.substring(0,i)+s.substring(++i,l),n));}

যদিও জাভা প্রায় সর্বদা ভার্বোস, তবে এই ক্ষেত্রে চ্যালেঞ্জের পক্ষে এটি অবশ্যই যথাযথ ভাষা নয়। সাবস্ট্রিংগুলির সাথে ক্রম উত্পাদনগুলি কার্য সম্পাদন এবং অদক্ষতার পক্ষে খারাপ।

অবশ্যই আরও কিছু গল্ফ করা যেতে পারে, যদিও।

-8 ধন্যবাদ বাইট @Jakob

ব্যাখ্যা:

এখানে চেষ্টা করুন। (পরীক্ষার ক্ষেত্রে 3 এর উপরে পারফরম্যান্স খুব খারাপ, তবে এটি স্থানীয়ভাবে কাজ করে ..)

import java.util.*;   // Required import for Set and HashSet

Set r=new HashSet();  // Result-Set on class-level

n->                   // Method with integer parameter and no return-type
  p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
                      //  Get all permutations and save them in the Set
                      // End of method (implicit / single-line return-statement)

void p(String p,String s,int n){
                      // Separated method with 2 String & int parameters and no return-type
  int l=s.length(),   //  The length of the second input-String
      i=0;            //  Index-integer, starting at 0
  if(l<1              //  If the length is 0,
     &&(s=p.substring(0,n)).equals(s.replaceAll("(.*)\\1","")))
                      //  and it doesn't contain a repeated part:
    r.add(s);         //   Add it to the result-Set
  for(;i<l;           //  Loop (2) from 0 to `l`
    p(                //   Recursive-call with:
      p+s.charAt(i),  //    Prefix-input + the character of the second input at index `i`
      s.substring(0,i)+s.substring(++i,l),
                      //    and the second input except for this character
      n)              //    and `n`
  );                  //  End of loop (2)
}                     // End of separated method

1
কিভাবে এই ল্যামডা সম্পর্কে: n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)। এছাড়াও, কেন রিফ্যাক্টর for(;i<1;p(...));না while(i<l)p(...);?
Jakob

@ জাকব ধন্যবাদ এবং আমি সর্বদা for(;...;)সৎ হতে কোডগল্ফিং-হ্যাবিট ব্যবহার করি না। সবচেয়ে খারাপ ক্ষেত্রে এটি যেমন বাইট-কাউন্ট হয় ঠিক তেমন while(...), বাইটগুলি সংরক্ষণ করার জন্য সবচেয়ে ভাল কেসটি লুপের ভিতরে রাখা যেতে পারে। তাই আমি চেষ্টা করছি whileকোডগল্ফিংয়ে মোটেও ব্যবহার না করার কারণ এটি কোনওভাবেই বাইট-কাউন্টের সুবিধা দেয় না। এটি হয় এটি বাড়িয়ে তোলে, বা একই থাকে, তাই আমি ব্যক্তিগতভাবে আরও ভাল পঠনযোগ্যতা নিয়ে বিরক্ত করি না। ;)
কেভিন ক্রুইজসেন

1
হ্যাঁ, আমি সর্বদা আমার গল্ফ কোডটি প্রদত্ত বাইট গণনায় যথাসম্ভব পঠনযোগ্য করার চেষ্টা করি। সম্ভবত একটি নিরর্থক সাধনা!
Jakob

অপেক্ষা করুন, আমার ল্যাম্বদা কি এখানে আসলে কাজ করে? আমি কিছুটা গাফিল ছিলাম ... এটি এন PRS সিকোয়েন্সগুলির একটি স্ট্রিং উত্পন্ন করে , যেখানে আপনার আসল লুপটি 2 ^ ( এন -2) সিকোয়েন্স সহ একটি উত্পন্ন করে ।
Jakob

@ জ্যাকব nবার "পিআরএস" সঠিক। খনি আরও উত্পাদন করছিল কারণ এটি বাইট সংরক্ষণ করেছিল (এবং কর্মক্ষমতা হ্রাস পেয়েছে, তবে কোডগল্ফের সাথে কে সে বিষয়ে চিন্তা করে)। ;)
কেভিন ক্রুইজসেন



4

পার্ল 5 , 37 বাইট

sub r{grep!/(.+)\1/,glob"{R,S,P}"x<>}

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

ফাংশনটি স্কোয়ার ফ্রি স্ট্রিংগুলির একটি অ্যারে প্রদান করে।

ব্যাখ্যা:

globদৈর্ঘ্য সঙ্গে আর, এস, & পি সব সমন্বয় ইনপুট সমান জেনারেট করে। grepবেশী যে বিনামূল্যে বর্গ নয় আউট বিবৃতি ফিল্টার।


ব্রেস সম্প্রসারণের দুর্দান্ত ব্যবহার!
ডম হেস্টিংস

3

আর , 97 বাইট

cat((x=unique(combn(rep(c('p','r','s'),n),n<-scan(),paste,collapse='')))[!grepl("(.+)\\1",x,,T)])

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

combn(rep(c('p','r','s'),n),n,paste,collapse='')সব নির্ণয় nসঙ্গে -character স্ট্রিং p, r, s, কিন্তু এটা দুর্ভাগ্যবশত সদৃশ অনেক (*), তাই আমরা এটা uniquify, এবং যারা যে Regex মেলে নিতে (.+)\1, পার্ল-শৈলী মেলানো ব্যবহার করে, তাহলে আমরা জানতে পরিসমাপ্তি তালিকা প্রিন্ট।

(*) প্রযুক্তিগতভাবে, এটি 3nঅক্ষরগুলির সমস্ত সংমিশ্রণ একবারে p,r,sনেওয়া পুনরাবৃত্তি 3 বারে উত্পন্ন করে n, তারপরে সরাসরি স্ট্রিংগুলি paste(..., collapse='')গণনা না 3^nকরে প্রতিটি সংমিশ্রণে প্রযোজ্য , তবে এটি একটি expand.grid(সত্যিকারের কার্তেসিয়ান পণ্য) এর চেয়ে গল্ফিয়ার ।


3

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30-57), 69 বাইট

f=n=>n?[for(x of f(n-1))for(y of'RPS')if(!/(.+)\1/.test(y+=x))y]:['']

যেহেতু স্কোয়ার-মুক্ত শব্দের সমস্ত সাবস্ট্রিংগুলিও বর্গামুক্ত, চেকটি পুনরাবৃত্তভাবে করা যায়।



2

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

n=>[...Array(3**n)].map(g=(d=n,i)=>d?'RPS'[i%3]+g(d-1,i/3|0):'').filter(s=>!/(.+)\1/.test(s))

সমস্ত সংখ্যাকে 0 থেকে 3ⁿ (বিপরীত প্যাডেড) বেস 3 RPSহিসাবে অঙ্ক হিসাবে ব্যবহার করে এবং স্কোয়ার-মুক্ত শব্দের জন্য ফিল্টার করে।


2

জুলিয়া, 88

f(n)=[filter(A->!ismatch.(r"(.+)\1",join(A)),Iterators.product(repeated("RPS",n)...))...]

অভিনব কিছু না।


1

সি # / লিনকিউ, 169

Enumerable.Range(0,(int)Math.Pow(3,n)).Select(i=>string.Concat(Enumerable.Range(1,n).Select(p=>"PRS"[(i/(int)Math.Pow(3,n-p))%3]))).Where(s=>!Regex.IsMatch(s,@"(.+)\1"))

এটি করার আরও ভাল উপায় থাকতে হবে :)


1

এফ #, 143

let f n=[1..n]|>List.fold(fun l _->List.collect(fun s->["R";"P";"S";]|>List.map((+)s))l)[""]|>Seq.filter(fun x->not(Regex.IsMatch(x,"(.+)\1")))

সুন্দর একটি এফ # উত্তর!
অলয়েসডজি মনিকা

1
এটি ভাষার সর্বাধিক সংক্ষিপ্ত নয়, তবে ওহে, এটি ব্যবহারের জন্য কোনও অজুহাত নয় :)
জেসন হ্যান্ডবি


1

k, 56 বাইট

f:{$[x;(,/"RPS",/:\:f x-1){x@&~~/'(2,y)#/:x}/1_!x;,""]}

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

$[ test ; if-true ; if-false ]

কে-এর টেরিনারি অপারেটর, এখানে আমরা শূন্য-অ-দৈর্ঘ্যের জন্য আকর্ষণীয় স্টাফ করি এবং শূন্য-দৈর্ঘ্যের শব্দের জিজ্ঞাসা করা হলে একটি খালি স্ট্রিং ফিরিয়ে আনি।

(,/"RPS",/:\:f x-1)

"আরপিএস" এবং সমস্ত এন -1 দৈর্ঘ্যের স্কোয়ারফ্রি শব্দের কার্টেসিয়ান পণ্য গ্রহণ করে। , /: \: ডানদিকে বামে প্রতিটি উপাদানকে যোগ করে দৈর্ঘ্য 3 অ্যারে দৈর্ঘ্য এন অ্যারে দেয়। , / এটিকে দৈর্ঘ্য 3n অ্যারে রূপান্তরিত করে।

{x@&~~/'(2,y)#/:x}

প্রতিটি স্ট্রিংয়ের প্রথম এন অক্ষর নেয় এবং এটি দ্বিতীয় এন এর সাথে তুলনা করে, তারপরে অ্যারে হ্রাস করে কেবল যেখানে তারা মেলে না। যেহেতু আমরা জানি পূর্ববর্তী ফলাফলটি বর্গমুক্ত, কেবলমাত্র প্রথম অক্ষর থেকে শুরু হওয়া সাবস্ট্রিংগুলির মিলের প্রয়োজন - চেকটি এখানে সরলকরণের জন্য পুনরাবৃত্তি বাস্তবায়নে ব্যয় করা অক্ষরগুলির মূল্য ছিল। অবশেষে,

/1_!x

1 থেকে (শব্দের দৈর্ঘ্য) -1 এর প্রতিটি স্ট্রিংয়ের দৈর্ঘ্যের উপর পুনরাবৃত্তি করে, তার বামে প্রাথমিক ফলাফল সেটটিতে ল্যাম্বডা প্রয়োগ করে। ! x 0 থেকে x-1 পর্যন্ত একটি তালিকা তৈরি করে, তারপরে 1_ প্রথম উপাদানটি সরিয়ে দেয় (যেহেতু 0 দৈর্ঘ্যের সাবস্ট্রিংগুলি সর্বদা মিলবে)

কয়েকটি চরিত্রের ত্যাগের জন্য আমরা ফাংশনটির নামের উপর নির্ভর না করে স্ব-রেফারেন্সে .z গুলি ব্যবহার করতে পারি এবং পারফরম্যান্সের জন্য কেবলমাত্র এন -1 দৈর্ঘ্যের সাব-স্ট্রিংগুলি চেক ফ্লোর (এন / 2) এর পরিবর্তে পরীক্ষা করতে পারি। এটি একটি 00 77০০ কে-তে প্রায় ১২০ সেকেন্ডে সমস্ত দৈর্ঘ্যের 49 টি শব্দ (যার মধ্যে 5207706 রয়েছে) সন্ধান করে, এর উপরে আমি ফ্রি 32-বিট কে-এর 4 জিবি সীমাতে চলেছি।

{$[x;(,/"RPS",/:\:.z.s x-1){x@&~~/'(2,y)#/:x}/1+!_x%2;,""]}

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