রুবিকের কিউব সমাধান করুন


38

সংক্ষিপ্ততম প্রোগ্রামটি লিখুন যা রুবিকের ঘনক্ষেত্রে সমাধান করে (3 * 3 * 3) একটি যুক্তিসঙ্গত পরিমাণের মধ্যে এবং চালনা করে (বলুন, আপনার মেশিনে সর্বাধিক 5 সেকেন্ড এবং 1000 এর চেয়ে কম চাল)।

ইনপুটটি ফর্ম্যাটে রয়েছে:

UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR

(এই নির্দিষ্ট ইনপুটটি হ'ল কিউবটি উপস্থাপন করে)।
প্রথম 12 2-অক্ষরের স্ট্রিংগুলি ইউএফ, ইউআর, ... বিএল পজিশনের প্রান্তগুলি (ইউ = আপ, এফ = সম্মুখ, আর = ডান, বি = পিছন, এল = বাম, ডি = ডাউন), তার পরের 8 3-অক্ষরের স্ট্রিংগুলি ইউএফআর, ইউআরবি, ... ডিবিআর অবস্থানের কোণে are

আউটপুটটি এই বিন্যাসে চলার ক্রম দেয়:

D+ L2 U+ F+ D+ L+ D+ F+ U- F+

যেখানে ডি 1 বা ডি + ডি (ডাউন) মুখটি 90 ডিগ্রি ঘড়ির কাঁটার দিকে ঘুরিয়ে উপস্থাপন করে, এল 2 এল মুখটি 180 ডিগ্রি, ইউ 3 বা ইউ-টি ঘুরছে 80 মুখের ঘড়ির কাঁটার দিকে 90 ডিগ্রি ঘুরিয়ে উপস্থাপন করে।
চিঠিগুলি কেস-সংবেদনশীল এবং শূন্যস্থানগুলি alচ্ছিক।

উদাহরণস্বরূপ, নিম্নলিখিত ইনপুটটির জন্য উপরের আউটপুটটি সঠিক:

RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU

আরও বিশদের জন্য, দয়া করে টমাস রোকির ঘন প্রতিযোগিতাটি দেখুন , কেবলমাত্র স্কোরিং কোনও সাধারণ কোড গল্ফিং সমস্যার মতো ফাইলের আকার দ্বারা করা হবে except একটি অনলাইন পরীক্ষকও অন্তর্ভুক্ত করা হয়।

রেফারেন্সের জন্য, ইতিমধ্যে লিখিত সংক্ষিপ্ততম সমাধান হ'ল কিউব প্রতিযোগী বিজয়ীদের তালিকার শেষ প্রবেশ


লেআউট ফর্ম্যাটটি কল্পনা করতে যারা সংগ্রাম করছেন তাদের জন্য:

0-1 2-3 4-5 6-7 8-9 10-11 12-13 14-15 16-17 18-19 20-21 22-23 24-25-26 27-28-29 30-31-32 33-34-35 36-37-38 39-40-41 42-43-44 45-46-47
UF  UR  UB  UL  DF   DR    DB   DL    FR    FL     BR    BL     UFR      URB      UBL      ULF      DRF      DFL      DLB      DBR

Front:

                 +-------+-------+-------+
                /       /       /       /|
               /  30   /   4   /  27   / |
              +-------+-------+-------+  |
             /       /       /       /|28+
            /   6   /       /   2   / | /|
           +-------+-------+-------+  |/ |
          /       /       /       /|3 +  |
         /  33   /   0   /  24   / | /|21+
        +-------+-------+-------+  |/ | /|
        |       |       |       |26+  |/ |
        |  35   |   1   |   25  | /|  +  |
        |       |       |       |/ | /|47+
        +-------+-------+-------+  |/ | /
        |       |       |       |17+  |/
        |  18   |       |  16   | /|11+
        |       |       |       |/ | /
        +-------+-------+-------+  |/
        |       |       |       |37+
        |  40   |   9   |  38   | /
        |       |       |       |/
        +-------+-------+-------+


Hidden faces:

                 +-------+-------+-------+
                /|       |       |       |
               / |  31   |   5   |  29   |
              +  |       |       |       |
             /|32+-------+-------+-------+
            / | /|       |       |       |
           +  |/ |  22   |       |  20   |
          /|7 +  |       |       |       |
         / | /|23+-------+-------+-------+
        +  |/ | /|       |       |       |
        |34+  |/ |  44   |  13   |  46   |
        | /|  +  |       |       |       |
        |/ | /|43+-------+-------+-------+
        +  |/ | /       /       /       /
        |19+  |/  42   /  12   /  45   /
        | /|15+-------+-------+-------+
        |/ | /       /       /       /
        +  |/  14   /       /  10   /
        |41+-------+-------+-------+
        | /       /       /       /
        |/  39   /   8   /   36  /
        +-------+-------+-------+

3
সি / সি ++ / জাভা / পার্ল / পাইথন ব্যতীত অন্য ভাষা গ্রহণযোগ্য?
ডিম স্ক্রিপটুনফ

@ ইগরসক্রিপটুনফ এখানে হ্যাঁ, আপনার পছন্দমতো ব্যবহার করুন, কেবল কিউব-সমাধানের পাঠাগার নেই।
অদিতসু

এবং স্কোরিং সম্পর্কে কি? সাধারণ কোড-গল্ফ স্কোরিং (প্রোগ্রামে বাইট) বা 2004 এর মতো জটিল স্কোরিং?
ডিম স্ক্রিপটুনফ

2
@jdstankosky, আমি একটি ডায়াগ্রাম যুক্ত করেছি।
পিটার টেলর

7
আমাদের কি স্টিকারগুলি টেনে এনে চারপাশে সরানোর অনুমতি দেওয়া হচ্ছে?
ইসজি

উত্তর:


25

সি ++ - 1123

যেহেতু কেউ এখনও পর্যন্ত কোনও উত্তর পোস্ট করেনি, তাই আমি 2004 এর সমাধানটি সহজ ও গল্ফ করার সিদ্ধান্ত নিয়েছি। আমি এখনও প্রশ্নের মধ্যে উল্লেখ করা সংক্ষিপ্ততমটির তুলনায় এটি এখনও অনেক পিছিয়ে।

#include<iostream>
#include<vector>
#define G(i,x,y)for(int i=x;i^y;i++)
#define h(x)s[a[x]/q*q+(a[x]+j)%q-42]
#define B(x)D=x;E=O.substr(j*3,3);G(i,0,3)E+=F[5-F.find(E[2-i])];G(i,0,D.length())D[i]=E[F.find(D[i++])];m.push_back(D);
#define P(a,b)G(i,0,6)G(k,49,52){e[0]=F[i];e[1]=k;m.push_back(e);}G(j,0,24){B(a)B(b)}
#define T C();z=m.size();for(b=c;b;){d=s;G(i,o=w=1,4){w*=z;if(o)G(j,0,w)if(o){s=d;u=j;G(k,0,i){f=m[u%z];G(x,0,f.length()){a=M[F.find(f[x++])];G(i,0,f[x]-48)G(l,0,2){q=3-l;p=4*l;G(j,0,q){t=h(p+3);G(k,-3,0)h(p-k)=h(p-1-k);h(p)=t;}}}u/=z;}C();if(c<b){u=j;G(k,0,i){std::cout<<m[u%z];u/=z;}b=c;o=0;}}}}
std::string s,a,D,E,d,f,e="  ",S="UFURUBULDFDRDBDLFRFLBRBLUFRURBUBLULFDRFDFLDLBDBR",F="ULFBRD",M[]={"KHEB*0.,","KRTI0<8@","KDNS*;2=","IVXG/@7>","BGWP,>4:","QNWT2468"},O=S.substr(24)+"FDRFRUFULFLDRDBRBURUFRFDBDLBLUBURBRDLDFLFULUBLBD";std::vector<std::string>m;int
w,X=8,Y=16,o,c,u,b,z,p,q,t;void C(){c=0;G(i,X,Y)c+=s[i]!=S[i];}main(int
g,char**v){G(i,1,g)s+=v[i];P("U2F1R1L3U2L1R3F1U2","L3R1F3L1R3D2L3R1F3L1R3");T;Y=24;T;X=0;T;m.clear();P("R3D3R1D3R3D2R1L1D1L3D1L1D2L3","R1F3L3F1R3F3L1F1");G(I,5,9){Y=I*6;T}}

এটি এলোমেলো নয়, তবে এটি সোজাভাবে এগিয়েও যায় না। এটি প্রথমে কোণগুলি সমাধান করে, তারপরে কোণগুলি। প্রতিটি পদক্ষেপে, এটি 4 টি অ্যালগরিদম এবং সাধারণ মুখের টার্নগুলির ক্রম (ক্রমানুসারে, এলোমেলোভাবে নয়) এর বিভিন্ন সংমিশ্রণ চেষ্টা করে, যতক্ষণ না এটি সমাধান করা টুকরো সংখ্যার উন্নতি খুঁজে পায়, তারপরে সমাধান না হওয়া পর্যন্ত পুনরাবৃত্তি করে। এটি প্রান্তগুলির জন্য 2 এবং কোণার জন্য 2 অ্যালগরিদম ব্যবহার করে, সমস্ত কিউব পজিশনে অনুবাদ করে।

উদাহরণস্বরূপ আউটপুট RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU:

L2F3B2F3B1U3F1B3R2F3B1U3F1B3D2F2L3D2L1U2B1L1R3U2R1L3B1U2R1U2L1F1B3U2B1F3L1U2L3R1D3L1R3B2L3R1D3L1R3L3R1D3L1R3B2L3R1D3L1R3B3F1D3B1F3R2B3F1D3B1F3U2F3L3R1B3L1R3U2L3R1B3L1R3F1D2F1L1R3D2R1L3F1D2F3L2U1B1F3L2F1B3U1L2R3L1F3R1L3U2R3L1F3R1L3U1F2U1L1R3F2R1L3U1F2U3L3U3L1U3L3U2L1R1U1R3U1R1U2R3F3U3F1U3F3U2F1B1U1B3U1B1U2B3L1B3R3B1L3B3R1B1B3D3B1D3B3D2B1F1D1F3D1F1D2F3R1F3L3F1R3F3L1F1R3B3R1B3R3B2R1L1B1L3B1L1B2L3R1D3L3D1R3D3L1D1B3D3B1D3B3D2B1F1D1F3D1F1D2F3U3R3U1R3U3R2U1D1R1D3R1D1R2D3

(২৩৪ চাল, এখানে ০.০ সেকেন্ড)


2
আপনি কী জানেন ... সেকেন্ডের মধ্যে আরও একটি উত্তর পোস্ট করা হয়েছিল :)
অদিতসু

যদিও এটি রুবি সমাধানের চেয়ে দীর্ঘতর, তবে আমি মনে করি যে এটি "যথাযথ সময়ের মধ্যে এবং চলাচলে" সমস্যার মানদণ্ডে আরও ভাল ফিট করে যদিও আমি এখনও এমন একটি সমাধান দেখতে চাই যা গড়ে ৫০ ডলারের আওতায় পড়ে, যদিও।
প্রিমো

2
@ প্রিমো ধন্যবাদ :) আমার মূল কোডটির গড় গড় 50 টি মুভ রয়েছে, 50 এর কম বয়সী হিসাবে আমার মনে হয় আপনার আরও বেশি (কিউব) অ্যালগরিদম বা থাইস্টলেথওয়েটের পদ্ধতির মতো আলাদা পদ্ধতির প্রয়োজন। তবে দক্ষতা (চলন সংখ্যায়) গল্ফের সাথে খুব সামঞ্জস্যপূর্ণ নয়। যাইহোক, বিকল্প সমাধানের জন্য টমাস রোকির প্রতিযোগিতার বিজয়ীদের পরীক্ষা করে দেখুন।
aditsu

23

পাইথন 1166 বাইট

পাঠযোগ্যতার স্বার্থে যথেষ্ট পরিমাণ শ্বেতস্থান ছেড়ে দেওয়া হয়েছে। ফাইলের আকার এই হোয়াইটস্পেস সরানোর, এবং বিভিন্ন খাঁজ মাত্রা পরিবর্তন করার পর পরিমাপ করা হয় Tab, Tab Space, Tab Tab, ইত্যাদি আমি কোন golfing যা খুব আয়তন বহুলাংশে কর্মক্ষমতা প্রভাবিত এড়ানো গেছেন।

T=[]
S=[0]*20,'QTRXadbhEIFJUVZYeijf',0
I='FBRLUD'

G=[(~i%8,i/8-4)for i in map(ord,'ouf|/[bPcU`Dkqbx-Y:(+=P4cyrh=I;-(:R6')]
R=range

def M(o,s,p):
 z=~p/2%-3;k=1
 for i,j in G[p::6]:i*=k;j*=k;o[i],o[j]=o[j]-z,o[i]+z;s[i],s[j]=s[j],s[i];k=-k

N=lambda p:sum([i<<i for i in R(4)for j in R(i)if p[j]<p[i]])

def H(i,t,s,n=0,d=()):
 if i>4:n=N(s[2-i::2]+s[7+i::2])*84+N(s[i&1::2])*6+divmod(N(s[8:]),24)[i&1]
 elif i>3:
  for j in s:l='UZifVYje'.find(j);t[l]=i;d+=(l-4,)[l<4:];n-=~i<<i;i+=l<4
  n+=N([t[j]^t[d[3]]for j in d])
 elif i>1:
  for j in s:n+=n+[j<'K',j in'QRab'][i&1]
 for j in t[13*i:][:11]:n+=j%(2+i)-n*~i
 return n

def P(i,m,t,s,l=''):
 for j in~-i,i:
  if T[j][H(j,t,s)]<m:return
 if~m<0:print l;return t,s
 for p in R(6):
  u=t[:];v=s[:]
  for n in 1,2,3:
   M(u,v,p);r=p<n%2*i or P(i,m+1,u,v,l+I[p]+`n`)
   if r>1:return r

s=raw_input().split()
o=[-(p[-1]in'UD')or p[0]in'RL'or p[1]in'UD'for p in s]
s=[chr(64+sum(1<<I.find(a)for a in x))for x in s]

for i in R(7):
 m=0;C={};T+=C,;x=[S]
 for j,k,d in x:
  h=H(i,j,k)
  for p in R(C.get(h,6)):
   C[h]=d;u=j[:];v=list(k)
   for n in i,0,i:M(u,v,p);x+=[(u[:],v[:],d-1)]*(p|1>n)
 if~i&1:
  while[]>d:d=P(i,m,o,s);m-=1
  o,s=d

নমুনা ব্যবহার:

$ more in.dat
RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU

$ pypy rubiks.py < in.dat
F3R1U3D3B1
F2R1F2R3F2U1R1L1
R2U3F2U3F2U1R2U3R2U1
F2L2B2R2U2L2D2L2F2

এটি প্রতিটি পদক্ষেপের সমাধানের জন্য আইডিএ * অনুসন্ধান ব্যবহার করে থিসলথওয়েটের অ্যালগোরিদমের বাস্তবায়ন। যেহেতু সমস্ত হিউরিস্টিক টেবিলগুলি উড়তে গণনা করা দরকার, বেশ কয়েকটি সমঝোতা করা হয়েছে, সাধারণত একটি হিউরিস্টিককে সাধারণত দুটি বা তার বেশি সমান আকারের অংশে বিভক্ত করে। এটি অনুসন্ধানের পর্বটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়, তবে এটি প্রাথমিকভাবে কিউব অবস্থার উপর নির্ভর করে তাত্পর্যপূর্ণ হতে পারে।

পরিবর্তনশীল সূচক

  • T - প্রধান তাত্পর্য টেবিল।
  • S- একটি সমাধান কিউব অবস্থা। প্রতিটি পৃথক টুকরা একটি বিট মাস্ক হিসাবে সংরক্ষণ করা হয়, একটি চরিত্র হিসাবে উপস্থাপন। একটি সমাধান ওরিয়েন্টেশন ভেক্টরকে শূন্য ভেক্টর হিসাবে সংজ্ঞায়িত করা হয়।
  • I - বিভিন্ন মোচড়, যাতে অনুসন্ধানের জায়গা থেকে তাদের সরিয়ে দেওয়া হয়।
  • G- মোচড়ের অনুমতিগুলির জন্য গোষ্ঠীগুলি, অদলবদলের জন্য জোড়া হিসাবে সঞ্চিত। সংযুক্ত স্ট্রিংয়ের প্রতিটি বাইট এক জোড়া জন্য এনকোড। প্রতিটি টুইস্টের জন্য ছয়টি অদল বদল প্রয়োজন: প্রান্ত চক্রের জন্য তিনটি এবং কোণার চক্রের জন্য তিনটি। সংক্ষিপ্ত স্ট্রিংয়ে কেবল মুদ্রণযোগ্য আসকি (চার্ট 32 থেকে 126) থাকে।
  • M - একটি ফাংশন যা একটি পদক্ষেপ সম্পাদন করে, জি দ্বারা প্রদত্ত।
  • N - এনকোডিংয়ের উদ্দেশ্যে চারটি অবজেক্টের একটি ক্রমকে সংখ্যায় রূপান্তর করে।
  • H - প্রদত্ত কিউব রাষ্ট্রের জন্য হিউরিস্টিক মান গণনা করে, টি থেকে সরানোর গভীরতার সন্ধান করতে ব্যবহৃত used
  • P - অ্যালগরিদমের একক পর্বের একক গভীরতায় অনুসন্ধান করুন।
  • s - ইনপুট কিউবের ক্রমশক্তি অবস্থা।
  • o - ইনপুট কিউবের ওরিয়েন্টেশন ভেক্টর।

কর্মক্ষমতা

টমাস রোকির ডেটা সেট ব্যবহার করে , এই স্ক্রিপ্টটির গড় গড় গড় 16.02 টি টুইস্ট রয়েছে (সর্বোচ্চ 35), গড় গড় গড় 472ms (i5-3330 সিপিইউ @ 3.0 গিগাহাট, পাইপাই 1.9.0) রয়েছে। সর্বনিম্ন সমাধানের সময়টি সর্বাধিক 2.97s, মানক বিচ্যুতি 0.488 সহ 233 মিমি ছিল। প্রতিযোগিতা থেকে স্কোরিং গাইডলাইন ব্যবহার করে (সাদা স্থান গণনা করা হয়নি, কীওয়ার্ডস এবং সনাক্তকারীগুলি 870 দৈর্ঘ্যের জন্য একটি বাইট হিসাবে গণনা করা হয়েছে), সামগ্রিক স্কোরটি 13,549 হত।

সর্বশেষ ৪ cases টি ক্ষেত্রে (এলোমেলো রাজ্যগুলি), এটির গড় প্রতি গড় .২২ মাইল সময় নিয়ে 30.83 টি টুইস্ট রয়েছে tw


থিসলেথওয়েটের অ্যালগোরিদমের নোটস

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

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

Thistlethwaite মূলত প্রস্তাব <L,R,F,B,U,D><L,R,F,B,U2,D2><L,R,F2,B2,U2,D2><L2,R2,F2,B2,U2,D2>। যাইহোক, ইনপুট ফর্ম্যাটটি দেওয়া, আমি মনে করি প্রথমে হ্রাস করা সহজ <L,R,F2,B2,U,D>(কোনও চতুর্থাংশের বাঁক Fবা না B), এবং তারপরে <L2,R2,F2,B2,U,D>অবশেষে অর্ধবৃত্তের অবস্থানে পৌঁছানোর আগে। কেন এটি ঠিক তা ব্যাখ্যা করার পরিবর্তে, আমি মনে করি প্রতিটি রাজ্যের মানদণ্ড নির্ধারণের পরে এটি স্পষ্ট হবে।

<L,R,F,B,U,D><L,R,F2,B2,U,D>

অর্ডার নির্মূল করার জন্য Fএবং Bকোয়ার্টার পালাক্রমে, শুধুমাত্র প্রান্ত সঠিকভাবে ভিত্তিক করতে হবে। 'সঠিক' এবং 'ভুল' ওরিয়েন্টেশন কী তা সম্পর্কে তার সাইটে গিলস রক্সের খুব ভাল ব্যাখ্যা রয়েছে, সুতরাং আমি ব্যাখ্যাটি তার কাছে ছেড়ে দেব। কিন্তু মূলত, (এবং এই কেন এই ইনপুট বিন্যাস তাই condusive হয় Fএবং Bবর্জন), একটি প্রান্ত cubie সঠিকভাবে ভিত্তিক হলে নিম্নোক্ত Regex মেলে: [^RL][^UD]। একটি সঠিক দিকনির্দেশটি সাধারণত একটি দিয়ে স্বাক্ষরিত হয় 0এবং এর সাথে ভুল হয় 1। মূলত Uএবং Dস্টিকারগুলি মুখ Rবা Lমুখের উপর, বা কোনও Uবা Dপ্রান্তের কিউবিগুলির প্রান্তে উপস্থিত নাও হতে পারে, বা একটি Fবা প্রয়োজনীয়তা ছাড়াই সেগুলিকে স্থানান্তরিত করা যায় না orB কোয়ার্টার টুইস্ট

<L,R,F2,B2,U,D><L2,R2,F2,B2,U,D>

এখানে দুটি মানদণ্ড। প্রথমত, সব কোণে সঠিকভাবে ওরিয়েন্টেড করা আবশ্যক, এবং দ্বিতীয়, মধ্যম স্তর cubies জন্য প্রতিটি ( FR, FL, BR, BL) কোথাও মধ্যম স্তর হতে হবে। একটি কোণার অরিয়েন্টেশন খুব সহজভাবে ইনপুট ফর্ম্যাটটি দিয়ে সংজ্ঞায়িত করা হয়: প্রথম Uবা এর অবস্থান D। উদাহরণস্বরূপ, URBওরিয়েন্টেশন 0(সঠিকভাবে ওরিয়েন্টেড) রয়েছে, LDFরয়েছে ওরিয়েন্টেশন 1এবং LFUওরিয়েন্টেশন রয়েছে 2

<L2,R2,F2,B2,U,D><L2,R2,F2,B2,U2,D2>

মানদণ্ডগুলি এখানে নিম্নরূপ: প্রতিটি মুখের মধ্যে কেবল তার মুখ থেকে সরাসরি মুখের মুখ থেকে সরাসরি স্টিকার থাকে from উদাহরণস্বরূপ, চেহারায় Uকেবল স্টিকার Uএবং Dস্টিকার Rথাকতে পারে , মুখে কেবল স্টিকার Rএবং Lস্টিকার Fথাকতে পারে , মুখে কেবল স্টিকার Fএবং Bস্টিকার ইত্যাদি থাকতে পারে। এটিকে নিশ্চিত করার সহজতম উপায় হ'ল প্রতিটি প্রান্তের অংশটি রয়েছে কিনা তা পরীক্ষা করা to এটির 'স্লাইস', এবং প্রতিটি কোণার অংশটি তার 'কক্ষপথে' থাকে। অধিকন্তু, প্রান্ত-কোণ সমতুল্যে মনোযোগ দেওয়া প্রয়োজন। যদিও, আপনি যদি কেবল কোণার সাম্য জন্য পরীক্ষা করেন তবে এজ প্যারিটিও গ্যারান্টিযুক্ত এবং তদ্বিপরীত।

মোড় কীভাবে ওরিয়েন্টেশনকে প্রভাবিত করে

Uএবং Dমোচড়গুলি প্রান্তের প্রবণতা বা কোণ কোণকে প্রভাবিত করে না। টুকরোটি ওরিয়েন্টেশন ভেক্টর আপডেট না করে সরাসরি অদলবদল করা যেতে পারে।

Rএবং Lমোচড়গুলি প্রান্তের দিকনির্দেশকে প্রভাবিত করে না, তবে তারা কোণার দিকনির্দেশকে প্রভাবিত করে। আপনি কীভাবে আপনার চক্রটিকে সংজ্ঞায়িত করেন তার উপর নির্ভর করে কোণার ওরিয়েন্টেশনের পরিবর্তনটি হয় হবে +1, +2, +1, +2বা +2, +1, +2, +1সমস্ত মডুলোর 3। লক্ষ্য করুন R2এবং L2ওঠা পড়ার কোণ অভিযোজন প্রভাবিত করে না, যেমন +1+2শূন্য মডিউল হয় 3, যেমন হয় +2+1

Fএবং Bপ্রান্ত ওরিয়েন্টেশন এবং কোণে উভয় দিককেই প্রভাবিত করে। এজ ওরিয়েন্টেশন হয়ে +1, +1, +1, +1(গেলিক ভাষার 2), এবং কোণার ওরিয়েন্টেশন জন্য একই Rএবং L। এটি নোট করুন F2এবং B2প্রান্তের দিক বা ত্রুটি-বিচ্যুতিকে প্রভাবিত করবেন না।


দুর্দান্ত লেখার। আপনি কি কোসেম্বার অ্যালগরিদম শুনেছেন?
মাইল মাইল

আমার আছে. নীতিগতভাবে, এটি একই অ্যালগরিদম, চার ধাপের পরিবর্তে, এর কেবল দুটি রয়েছে: <L,R,F,B,U,D>-> <L2,R2,F2,B2,U,D>-> <I>। একটি কিউব সমাধানের জন্য এটি সর্বাধিক 29 টি টুইস্টের প্রয়োজন (থিস্টলেথওয়েটের পরিবর্তে 52 এর পরিবর্তে), তবে এটির জন্য খুব বড় লক টেবিলগুলিও প্রয়োজন, যা 'ফ্লাইতে' উত্পন্ন করা অবৈধ হবে।
প্রিমো

@ P0W ইনপুট ফর্ম্যাটটি কিছুটা বিভ্রান্তিকর, আমার সন্দেহ হয় আপনার সেখানে কোনও ত্রুটি থাকতে পারে। প্রতিটি ক্ষেত্রেই আমি সমাধানের ফলাফল যাচাই করেছি।
প্রিমো

@ প্রিমো আপনার যদি নন-গল্ফযুক্ত কোডটি থাকে তবে এটির একটি লিঙ্ক প্রকাশ করতে আপনি কি আপত্তি করবেন?
বিল

12

রুবি, 2৪২ টি অক্ষর

r=->y{y.split.map{|x|[*x.chars]}}
G=r['UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR']
o=r[gets]
x=[];[[%w{U UU UUU L LL LLL}+D=%w{D DD DDD},0],[%w{FDFFF RFDFFFRRR}+D,12],[%w{DDDRRRDRDFDDDFFF DLDDDLLLDDDFFFDF}+D,8],[%w{DFLDLLLDDDFFF RDUUUFDUUULDUUUBDUUU}+D,4],[%w{LDDDRRRDLLLDDDRD RRRDLDDDRDLLLDDD LFFFLLLFLFFFLLLF},16]].map{|q,y|x+=[*y..y+3]
3.times{q.map{|e|q|=[e.tr('LFRB','FRBL')]}}
w=->u{x.count{|t|u[t]!=G[t]}}
s=w[o]
(c=(0..rand(12)).map{q.sample}*''
z=o
c.chars{|m|z="=$'*:036\".?BOHKVGRWZ!$@*-0C69<4(E\\INQTMX!$'B-03<9*?6EHYLQPUZ!9'*-?360<$BSFKN[TWJ$'*!-0369<?BHKNEQTWZ!$'*6-039<?BEHKNTWZQ"[20*('FBLRUD'=~/#{m}/),20].bytes.map{|e|z[e/3-11].rotate e%3}}
t=w[z]
(c.chars{|e|$><<e<<'1 '};o=z;s=t)if s>t
)until s<1}

উপরের রুবি কোডটি এখনও পুরোপুরি গল্ফ হয়নি। কোডটি আরও উন্নত করার সম্ভাবনা রয়েছে (তবে এটি স্টার্টার হিসাবে ইতিমধ্যে যথেষ্ট)।

এটি স্তর দ্বারা কিউব স্তরটি সমাধান করে তবে কোনও নির্দিষ্ট অ্যালগরিদম ব্যবহার করে না তবে ঘনকটি সমাধান না হওয়া অবধি চলনগুলির এলোমেলো ক্রম সম্পাদন করে।

সম্ভাব্য প্রকৃতির কারণে এটি কখনও কখনও ঘনকটি সমাধান করতে 5 সেকেন্ডের বেশি সময় নিতে পারে এবং বিরল ক্ষেত্রে 1000 এরও বেশি পদক্ষেপ নিতে পারে।

উদাহরণ আউটপুট (ইনপুট জন্য 'RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU') 757 পদক্ষেপ:

F1 R1 R1 F1 F1 F1 R1 R1 R1 L1 L1 L1 F1 D1 L1 L1 D1 D1 D1 D1 L1 B1 D1 
B1 B1 B1 L1 L1 L1 F1 D1 F1 F1 F1 L1 D1 L1 L1 L1 B1 D1 B1 B1 B1 R1 D1 
R1 R1 R1 L1 B1 D1 B1 B1 B1 L1 L1 L1 D1 D1 B1 D1 B1 B1 B1 B1 D1 B1 B1 
B1 L1 D1 L1 L1 L1 D1 D1 D1 D1 D1 R1 D1 R1 R1 R1 R1 F1 D1 F1 F1 F1 R1 
R1 R1 R1 D1 R1 R1 R1 F1 L1 D1 L1 L1 L1 F1 F1 F1 D1 D1 D1 D1 L1 D1 L1 
L1 L1 F1 L1 D1 L1 L1 L1 F1 F1 F1 D1 D1 L1 D1 L1 L1 L1 D1 L1 D1 L1 L1 
L1 L1 D1 L1 L1 L1 D1 R1 D1 D1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 B1 D1 
L1 D1 D1 D1 L1 L1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 D1 D1 B1 B1 B1 D1 B1 
D1 R1 D1 D1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 B1 D1 R1 D1 D1 D1 R1 R1 
R1 D1 B1 D1 D1 D1 B1 B1 B1 D1 D1 D1 L1 L1 L1 D1 L1 D1 B1 D1 D1 D1 B1 
B1 B1 D1 D1 D1 L1 L1 L1 D1 L1 D1 D1 F1 D1 D1 D1 F1 F1 F1 D1 D1 D1 R1 
R1 R1 D1 R1 D1 D1 D1 R1 R1 R1 D1 R1 D1 F1 D1 D1 D1 F1 F1 F1 D1 B1 D1 
D1 D1 B1 B1 B1 D1 D1 D1 L1 L1 L1 D1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 
D1 D1 D1 L1 L1 L1 D1 D1 D1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 
L1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 L1 L1 D1 F1 D1 D1 D1 
F1 F1 F1 D1 D1 D1 R1 R1 R1 D1 R1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 
D1 L1 L1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 L1 L1 D1 D1 D1 
D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 L1 L1 D1 D1 D1 D1 D1 D1 R1 F1 
D1 F1 F1 F1 D1 D1 D1 R1 R1 R1 D1 F1 L1 D1 L1 L1 L1 D1 D1 D1 F1 F1 F1 
D1 B1 R1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 B1 R1 D1 R1 R1 R1 D1 D1 D1 
B1 B1 B1 D1 D1 D1 D1 B1 R1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 D1 D1 D1 
D1 D1 B1 B1 B1 D1 F1 D1 D1 D1 B1 D1 F1 F1 F1 D1 D1 D1 R1 R1 R1 D1 L1 
D1 D1 D1 R1 D1 L1 L1 L1 D1 D1 D1 B1 D1 D1 D1 F1 F1 F1 D1 B1 B1 B1 D1 
D1 D1 F1 D1 B1 B1 B1 D1 F1 D1 D1 D1 B1 D1 F1 F1 F1 D1 D1 D1 L1 D1 D1 
D1 R1 R1 R1 D1 L1 L1 L1 D1 D1 D1 R1 D1 F1 R1 R1 R1 F1 F1 F1 R1 F1 R1 
R1 R1 F1 F1 F1 R1 R1 R1 R1 D1 L1 D1 D1 D1 R1 D1 L1 L1 L1 D1 D1 D1 B1 
B1 B1 D1 F1 D1 D1 D1 B1 D1 F1 F1 F1 D1 D1 D1 F1 R1 R1 R1 F1 F1 F1 R1 
F1 R1 R1 R1 F1 F1 F1 R1 F1 D1 D1 D1 B1 B1 B1 D1 F1 F1 F1 D1 D1 D1 B1 
D1 F1 R1 R1 R1 F1 F1 F1 R1 F1 R1 R1 R1 F1 F1 F1 R1 F1 F1 F1 D1 B1 D1 
D1 D1 F1 D1 B1 B1 B1 D1 D1 D1 R1 D1 D1 D1 L1 L1 L1 D1 R1 R1 R1 D1 D1 
D1 L1 D1 R1 R1 R1 D1 L1 D1 D1 D1 R1 D1 L1 L1 L1 D1 D1 D1 R1 D1 D1 D1 
L1 L1 L1 D1 R1 R1 R1 D1 D1 D1 L1 D1 F1 F1 F1 D1 B1 D1 D1 D1 F1 D1 B1 
B1 B1 D1 D1 D1 L1 L1 L1 D1 R1 D1 D1 D1 L1 D1 R1 R1 R1 D1 D1 D1 

একই পদক্ষেপগুলি একত্রে ভাগ করা থাকলে মুভ-কাউন্টটি যথেষ্ট পরিমাণে হ্রাস করা সম্ভব। সুতরাং, এক যেমন আউটপুট প্রতিস্থাপন করতে পারেন

(c.gsub(/(.)\1*/){j=$&.size%4;$><<$1<<j<<' 'if j>0};o=z;s=t)if s>t

ভাল, তবে কখনও কখনও এটি আমার কম্পিউটারে 20 সেকেন্ডেরও বেশি সময় নেয়, এক ক্ষেত্রে এটি 48.7 সেকেন্ডে শেষ হয়েছে
অদিতসু

@ অ্যাডিতসু হ্যাঁ তবে আপনি কোন রুবি ইন্টারপ্রেটার ব্যবহার করেন তার উপরও এটি দৃ strongly়তার সাথে নির্ভর করে। আমার মেশিনে এটি সাধারণত 5 সেকেন্ডেরও কম সময় নেয়।
হাওয়ার্ড

আমি বর্তমানে রুবি ব্যবহার করছি 1.9.3_p392, এটি প্রায় 5 সেকেন্ডেরও কম সময় নেয় তবে আমি "সাধারণত" বলতে পারি না
অদিতসু

এই ইনপুটটি ব্যবহার করে দেখুন:FU FR RU BR DB LD LU LB LF RD DF BU FRU BUR FDR DLB DFL LUB FUL DBR
অদিতসু

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