রুবিকের কিউব স্ক্র্যাম্বলস


21

আপনার কাজটি চলনগুলির একটি এলোমেলো ক্রম তৈরি করা, যা কোনও রুবিকের কিউবকে স্ক্যাম্বল করতে ব্যবহার করা যেতে পারে। এই ধরণের স্ক্যাম্বলটি হুবহু 25 টি চাল নিয়ে গঠিত। প্রতিটি পদক্ষেপে চিঠিগুলি UDRLFBoptionচ্ছিকভাবে একটি প্রত্যয় যুক্ত হয় '2

এই স্বরলিপিটি সিঙ্গমাস্টার স্বরলিপি বলে। UDRLFB6 টির মধ্যে একটির মুখ '2উপস্থাপন করে এবং alচ্ছিক প্রত্যয়টি বাঁক কোণকে উপস্থাপন করে। এই তথ্যটি কোনওভাবেই কার্যটি সমাধান করার জন্য প্রয়োজনীয় নয়।

এই নিশ্চয়তার জন্য, যে স্ক্র্যাম্বলগুলি 'ভাল মানের', নিম্নলিখিত দুটি বিধি প্রয়োগ করতে হবে:

  • পরপর দুটি পদক্ষেপে একই বর্ণ থাকতে হবে না। এই পরপর প্যাচসমূহ নিষিদ্ধ UU, DD, RR, LL, FFএবং BBএবং তাদের সব সমন্বয় মত ঐচ্ছিক প্রত্যয় ব্যবহার U2Uবা U'U'

    এই সরানো জোড়গুলিকে নিষিদ্ধ করা হয়েছে, কারণ এগুলি সহজেই 1 বা 0 টি চালগুলিতে কমে যেতে পারে। U2Uহিসাবে একই প্রভাব রয়েছে U', R'Rহিসাবে একই প্রভাব

  • পরপর তিনটি পদক্ষেপ অবশ্যই একই বর্ণ গোষ্ঠীর হতে হবে না। চিঠি গ্রুপগুলি হ'ল UD, RLএবং FB। এই নিয়ম অতিরিক্ত পরপর প্যাচসমূহ নিষিদ্ধ UDU, DUD, RLR, LRL, FBF, BFBএবং তাদের সব সমন্বয় মত ঐচ্ছিক প্রত্যয় ব্যবহার U2DU, RL'Rবা B2FB'

    গ্রুপগুলি তাদের সরানো অক্ষ দ্বারা মুখগুলি সাজান sort Uএবং Dএকই গ্রুপে রয়েছে, কারণ উভয়ই একই অক্ষকে ঘুরিয়ে দেয়। অতএব একটি Uপদক্ষেপ Dমুখের টুকরোগুলি প্রভাবিত করে না এবং কোনও Dপদক্ষেপ Uমুখের টুকরোগুলিকে প্রভাবিত করে না । সুতরাং দুটি পদক্ষেপের বিনিময় হতে পারে, UDUএকই প্রভাব আছে UUDএবং এটি কমে যেতে পারে U2D

চ্যালেঞ্জ

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

আপনার প্রোগ্রামটি প্রতিটি স্ক্র্যাম্বেল তৈরি করতে সক্ষম হতে হবে যা উপরের নিয়মগুলিকে সন্তুষ্ট করে। অবশ্যই ধরে নিচ্ছি যে, এলোমেলো নম্বর জেনারেটরটি সত্যই এলোমেলো, এবং সিউডো এলোমেলো নয়।

এটি কোড-গল্ফ। সংক্ষিপ্ততম কোড ( বাইটে গণনা করা ) জয়ী।

উদাহরণস্বরূপ ফলাফল:

স্ক্রিপ্ট / ফাংশনটিতে 3 বার কল করার জন্য এমন কিছু মুদ্রণ / ফেরত দেওয়া উচিত:

R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D

যদি আপনি প্রতিটি স্থানের সাথে চালগুলি পৃথক করে থাকেন:

R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'

লক্ষ্য করুন, এই সমস্ত আউটপুটগুলিতে 25 টি চাল রয়েছে, তবে lengthচ্ছিক প্রত্যয়গুলির কারণে এটির দৈর্ঘ্য আলাদা। এটি কোনও স্থান মুদ্রণের অনুমতি নেই, যখন হয় প্রত্যয় হিসাবে ব্যবহৃত হয় 2বা হয় '। আপনাকে প্রিন্ট করতে হবে L2UR2F'R'U2বা L2 U R2 F' R' U2L2U R2F'R'U2অনুমোদিত নয়।


আপনার মানে কি UR 2অনুমোদিত নয়? U R2 উচিত অনুমতি দেওয়া হবে, আমি মনে করি, যেহেতু প্যাচসমূহ মধ্যে শূণ্যস্থান জ্ঞান করে তোলে।
mbomb007

@ mbomb007 মানে জিনিস পছন্দ করা L2U R2F'R'U2Uকোনও alচ্ছিক প্রত্যয় নেই এবং তাই এর স্থান থাকা উচিত নয়। Spaceচ্ছিক প্রত্যয়টির জন্য কোনও স্থান প্রতিস্থাপন হওয়া উচিত নয়।
জাকুবে

যদি প্রতিটি পদক্ষেপের মধ্যে ফাঁকা স্থান থাকে? U F2 L D2 R'...উদাহরণস্বরূপ, আমরা আউটপুট করতে পারি ? এই ক্ষেত্রে, কোনও অতিরিক্ত স্থান নেই, যা আমি মনে করি আপনার নিয়ম অনুযায়ী ঠিক হওয়া উচিত।
mbomb007

@ mbomb007 হ্যাঁ, আমি এটি বিবরণে রাখব।
জাকুবে

চিঠির আগে কি 2? ওও
অলিভার নি

উত্তর:


6

সিজেম, 47 45 বাইট

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

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

{BA^2/6,_B-?A:B-mr0=:A"UDRLFB"=3mr[L2'']=}25*

ব্যাখ্যা

{               "Loop...";
  BA^2/           "If the two previous moves were not from the same group, ...";
  6,              "... then produce the available move list [0 1 2 3 4 5], ...";
  _B-             "... else produce the available move list [0 1 2 3 4 5] with
                   the second previous move removed";
  ?
  A:B             "Save the previous move as the second previous move";
  -               "Remove the previous move from the available move list";
  mr0=            "Randomly select an available move";
  :A              "Save this move as the previous move";
  "UDRLFB"=       "Map this move to its character (implicitly printed)";
  3mr[L2'']=      "Randomly select a modifier (implicitly printed)";
}25*            "... 25 times";

9

সি, 129

f(){int i,n,m,r,s,t;for(i=26;i--;i<25&&printf("%c%c","URFDLB"[s%6],"'2"[r%3])){for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;s+=m;}}

অভ্যন্তরীণ লুপটি mপরিসরে একটি মান তৈরি করে 1..5যা যখন যোগ করা হয় sএবং মডিউল taken গ্রহণ করা হয়, তা নিশ্চিত করে যে কোনও দুটি ক্রমাগত পদক্ষেপ কিউবের একই পাশে নেই। এর পুরানো মানটি mসঞ্চিত রয়েছে nএবং পরীক্ষাটি m*n==9নিশ্চিত করে যে মান m= 3 একবারে একবারে দুবার উত্পন্ন হয় না (সুতরাং বিপরীত মুখগুলি সারিতে দু'বার বাছাই করা যায় না; স্ট্রিংয়ের মুখের ক্রমটি নোট করুন))

অন্তত গুরুত্বপূর্ণ অংশ rযা প্রত্যয় (সিদ্ধান্ত নিতে ব্যবহার করা হয় ', 2ব্যবহার অথবা নাল), শেষে নাল চরিত্র সুবিধার সুযোগ গ্রহণ "'2"

বাইরের লুপটি 26 বার চলে। প্রথমবার, Uকখনই বাছাই করা যায় না, তাই printfপ্রথম পুনরাবৃত্তির জন্য চাপা থাকে।

পরীক্ষা প্রোগ্রামে অবহেলিত কোড

Ungolfed কোড রাখে একটি স্থান স্বচ্ছতার জন্য প্রতিটি পদক্ষেপ মধ্যে (golfed কোড অর্ডার এক বাইট সংরক্ষণ করার জন্য, না।) উপরন্তু golfed কোড relocating দ্বারা একটি সেমিকোলন সংরক্ষণ printfমধ্যে forবন্ধনী।

f(){
  int i,n,m,r,s,t;
  for(i=26;i--;){
    for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;
    s+=m;
    i<25&&printf("%c%c ","URFDLB"[s%6],"'2"[r%3]);
  }
}

main(){
  int j;
  srand(time(0));
  for(j=0;j<5;j++)f(), puts("");
}

সাধারণ আউটপুট

U' B D2 B' R' L F' D2 B D2 B2 R' B2 U D2 F' R U R' L B' L R2 B2 F'
U B U B F L2 D2 B' U' L B L R' D B U' D R D' B' F2 D' B D R
L D F2 B2 R' U F B' D2 L U R' L' U2 F' R F D U2 B L' B' U L2 F'
R2 B' F2 R2 L2 F' U2 L U' B' F R' D' F2 D F' L2 U2 R' D' B2 D F R2 L'
U2 F2 B2 D' F D F R L2 U' B D2 L' R D R F2 R' F2 U2 D R' D2 L F2



4

Pyth, 65 66

আমি পাইথের মধ্যে সত্যই কখনও গল্ফ করিনি, সম্ভবত একটি বা দুটি প্রোগ্রাম লিখেছি। এটি মূলত @ স্টিভেরলিলের সমাধান পাইথকে অনুবাদ করা। উন্নয়নের পরামর্শ স্বাগত।

আপডেট: স্ক্র্যামবলগুলি তৈরি করতে 1 বাইট যুক্ত করা হয়েছে U। সম্ভবত সি সমাধান এটিকে কাজ করার জন্য অপরিজ্ঞাত আচরণের উপর নির্ভর করছে ...

=YO6V25JZK1WK=GO15=Z/+3G3=Kq9*ZJ)~YZpd+@"URFDLB"%Y6?@"'2"%G3>2%G3k

আমি বিশ্বাস করি এটি কম অ্যাসাইনমেন্টের সাথে করা উচিত, তবে এটির জন্য আমাকে অ্যালগরিদমকে অনেক সংশোধন করতে হবে। (ভাল, চেষ্টা করতে পারেন।)

সি কোডের ভিত্তিতে এখানে একটি ব্যাখ্যা দেওয়া হয়েছে:

=YO6           s = random.choice(range(6))
V25            for i in range(25):
  JZ               n = m
  K1               t = 1
  WK               while t:
    =GO15              r = random.choice(range(15))
    =Z/+3G3            m = (r + 3) / 3
    =Kq9*ZJ            t = 9 == m * n
  )
  ~YZ              s += m
  pd               print(..., end = " ")
  +                ... + ...
  @"URFDLB"%Y6     "URFDLB"[s % 6]
  ?@"'2"%G3>2%G3k  "'2"[G % 3] if 2 > G % 3 else ""

ভেরিয়েবলগুলি পরিবর্তন করুন Yএবং ZZ0 দিয়ে পূর্বনির্ধারিত হয়, সুতরাং আপনি প্রথম 3 টি অক্ষর সংরক্ষণ করুন।
জাকুবে

@ জাকুব তবে তারপরে আমার n = m(তৃতীয় ব্যাখ্যা লাইন) সেট করা দরকার , যার অর্থ n = 0প্রথম বার হওয়া উচিত , যার Y
ফলস্বরূপ

Yএকটি খালি তালিকার সাথে পূর্বনির্ধারিত হয় []। এবং আমি মনে করি না nপ্রথম পুনরাবৃত্তিতে বিষয়গুলির মান ।
জাকুবে 10

BTW, আপনার কোড scrambles যে দিয়ে শুরু হতে পারে না U
জাকুবে 10

@ জাকুব ধন্যবাদ, স্থির।
পুর্কাকুডারী

4

জাভাস্ক্রিপ্ট (ES6) 175 178 204

3 বাইট কম সম্পাদনা করুন , 1 কোড পরিবর্তন করে 2 এবং উপায় পরিবর্তন করে 2 বাইটগুলি গণনা করা হচ্ছে (গণনা হচ্ছে না F=)

পুনরাবৃত্তিগুলি এড়াতে কোডটি @ স্টেভমিলারের কাছ থেকে নেওয়া হয়েছে। চিঠি গোষ্ঠীগুলি পরিচালনা করার তার পদ্ধতি আরও ভাল তবে আমি এটি চুরি করতে যাচ্ছি না।

বোনাস: আপনি বিকল্পের পদক্ষেপের সংখ্যা নির্দিষ্ট করতে পারেন।

(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

কম গল্ফড

(n = 25) => 
{
  R = n => Math.random()*n | 0;
  N = _ => 'UDRLFB'[(r += 1+R(5)) % 6];
  r = 0;
  b = N();
  a = N();
  for(s = '' ; n; )
     c = N(),
     ~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')
       ? 0
       : s += (--n, a=b, b=c) + ["","'",2][R(3)];
  return s
}

পরীক্ষা

var F=
(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

function go() {
  console.log(F(+M.value))
}

go()
Moves <input type=number min=1 id=M value=25 max=999>
<button onclick='go()'>Test</button>



2

জাভা 8, 189 183 বাইট

v->{for(int i=26,n,m=0,r=0,s=0,t;i-->0;){for(n=m,t=1;t>0;t=m*n==9?1:0)m=(r=(int)(Math.random()*15))/3+1;s+=m;if(i<25)System.out.print("URFDLB".charAt(s%6)+(r%3<1?"'":r%3<2?"2":""));}}

@LevelRiverSt এর সি উত্তরের পোর্ট । আমি নিজে কিছু জিনিস চেষ্টা করেছিলাম, তবে এটি আমার চেয়ে কম ছিল ..

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



1

ক্লোজার, 223 বাইট

(let[R(range)F(fn[f p c](apply concat(filter f(partition-by p c))))](apply str(map str(take 25(F(fn[p](<(count p)3))(zipmap"UDLF""1122")(F(fn[p](=(count p)1))int(for[_ R](rand-nth"UDRLFB")))))(for[_ R](rand-nth[""\'\2])))))

এটি "সিকোয়েন্স -> পার্টিশন বাই -> ফিল্টার -> কনক্যাট" প্যাটার্নের উপর নির্ভর করে, এটি মুখগুলির "অবৈধ" সিক্যুয়েন্সগুলি ফিল্টার করার জন্য ব্যবহৃত হয়। এই সিকটিটি পরে এলোমেলো পোস্টফিক্সের সাথে খালি স্ট্রিং সহ স্ট্রিংয়ের সাথে ম্যাপ করা হয়।

অবারিত বিন্দু:

(->> (for[_(range)](rand-nth"UDRLFB"))
     (partition-by int)           ; "identity" would be the correct fn to use here
     (filter(fn[p](=(count p)1))) ; Only one identical value in partition
     (apply concat)
     (partition-by(zipmap"UDLF""1122")) ; R & B are in the implicit nil group
     (filter(fn[p](<(count p)3)))       ; Only 1 or 2 consecutive faces from a group
     (apply concat)
     (take 25))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.