रूबिक का घन हल करें


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-वर्ण के तार कोने हैं।

आउटपुट को इस प्रारूप में चाल का क्रम देना चाहिए:

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

जहां डी 1 या डी + डी (डाउन) फेस को दक्षिणावर्त 90 डिग्री मोड़ने का प्रतिनिधित्व करता है, वहीं एल 2 एल फेस को 180 डिग्री, यू 3 या यू को बदल रहा है।
पत्र मामले-असंवेदनशील हैं और रिक्त स्थान वैकल्पिक हैं।

उदाहरण के लिए, उपरोक्त इनपुट निम्न इनपुट के लिए सही है:

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

अधिक जानकारी के लिए, टॉमस रोक्की की क्यूब प्रतियोगिता का संदर्भ लें , स्कोरिंग को छोड़कर सामान्य आकार की कोडिंग समस्या की तरह फ़ाइल आकार द्वारा सीधे किया जाएगा। एक ऑनलाइन परीक्षक भी शामिल है।

संदर्भ के लिए, पहले से लिखा गया सबसे छोटा समाधान घन प्रतियोगिता विजेताओं की सूची में अंतिम प्रविष्टि है


लेआउट प्रारूप की कल्पना करने वालों के लिए:

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
क्या C / C ++ / Java / Perl / Python के अलावा अन्य भाषाएँ स्वीकार की जाती हैं?
ईगोर स्क्रीप्टुनोफ

@EgorSkriptunoff यहां हां में, जो कुछ भी आपको पसंद है, उसका उपयोग करें, बस कोई क्यूब-सॉल्विंग लाइब्रेरी नहीं।
aditsu

और स्कोरिंग का क्या? सामान्य कोड-गोल्फ स्कोरिंग (प्रोग्राम में बाइट्स) या 2004 की प्रतियोगिता में जटिल स्कोरिंग?
ईगोर स्क्रीप्टुनोफ

2
@jdstankosky, मैंने एक आरेख जोड़ा है।
पीटर टेलर

7
क्या हमें स्टिकर खींचने और उन्हें इधर-उधर करने की अनुमति है?
इज़्ज़ी डिक

जवाबों:


25

C ++ - 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

(234 चाल, 0.3 सेकंड यहाँ)


2
आपको क्या पता ... एक और जवाब सेकंड के भीतर पोस्ट किया गया था :)
aditsu

हालांकि यह रूबी समाधान से अधिक लंबा है, मुझे लगता है कि यह समस्या के मानदंडों को "उचित समय और चाल के भीतर" बेहतर ढंग से फिट करता है मैं अभी भी एक समाधान देखना चाहता हूं जो कि ~ 50 चालों के तहत औसत है, हालांकि।
प्रिमो

2
@primo धन्यवाद :) मेरा मूल कोड 50 से अधिक चालों का औसत था, 50 से कम के लिए मुझे लगता है कि आपको या तो अधिक (क्यूब) एल्गोरिदम की आवश्यकता है या एक अलग दृष्टिकोण जैसे कि थीस्लथेवाइट की विधि। हालांकि, दक्षता (चालों की संख्या में) गोल्फिंग के साथ बहुत संगत नहीं है। वैसे भी, वैकल्पिक समाधान के लिए टॉमस रोक्की की प्रतियोगिता के विजेताओं की जाँच करें।
8

23

अजगर 1166 बाइट्स

पठनीयता के लिए व्हॉट्सएप की काफी मात्रा को छोड़ दिया गया है। आकार इस सफेद स्थान को निकाल, और करने के लिए विभिन्न इंडेंटेशन स्तर बदलने के बाद मापा जाता है Tab, Tab Space, Tab Tab, आदि मैं भी किसी भी गोल्फ जो भी काफी प्रदर्शन को प्रभावित किया बचा लिया है।

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 - दिए गए घन राज्य के लिए अनुमानी मूल्य की गणना करता है, जिसका उपयोग टी से गहराई को देखने के लिए किया जाता है।
  • P - एल्गोरिथ्म के एकल चरण की एक ही गहराई पर एक खोज करें।
  • s - इनपुट क्यूब का क्रमचय अवस्था।
  • o - इनपुट क्यूब का ओरिएंटेशन वेक्टर।

प्रदर्शन

टॉमस रोक्की के डेटा सेट का उपयोग करते हुए , इस स्क्रिप्ट में औसतन 16.02 ट्विस्ट प्रति हल (अधिकतम 35), औसत समय 472ms (i5-3330 CPU @ 3.0 Ghz, PyPy 1.9.0) के साथ था। न्यूनतम समाधान समय अधिकतम 2.97 के साथ 233ms था, मानक विचलन 0.488। प्रतियोगिता से स्कोरिंग दिशानिर्देशों का उपयोग करते हुए (सफेद स्थान की गणना नहीं की जाती है, कीवर्ड और पहचानकर्ता 870 की लंबाई के लिए एक बाइट के रूप में गिना जाता है), कुल स्कोर 13,549 रहा होगा।

पिछले 46 मामलों (रैंडम स्टेट्स) के लिए, इसने औसतन 721ms के साथ 30.83 ट्विस्ट प्रति सॉल्व किया।


थीस्लथ्वाइट के एल्गोरिथम पर नोट्स

किसी के लाभ के लिए, जो थीस्लथेवाइट के एल्गोरिथ्म के कार्यान्वयन का प्रयास करना चाहते हैं , यहां एक संक्षिप्त विवरण दिया जा सकता है।

एल्गोरिथ्म एक बहुत ही सरल समाधान अंतरिक्ष कमी सिद्धांत पर काम करता है। यही है, क्यूब को उस अवस्था में कम करें जिसमें इसे हल करने के लिए ट्विस्ट का एक सबसेट आवश्यक नहीं है, इसे एक छोटे से घोल के स्थान पर कम करें, और फिर बचे हुए कुछ ट्विस्ट का उपयोग करके शेष को हल करें।

थीस्लथ्वाइट ने मूल रूप से <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, केवल किनारों को सही ढंग से उन्मुख होना चाहिए। गाइल्स रौक्स ने अपनी साइट पर 'सही' और 'गलत' अभिविन्यास के बारे में बहुत अच्छी व्याख्या की है, इसलिए मैं उसे समझाता हूँ। लेकिन मूल रूप से, (और यही कारण है कि यह इनपुट प्रारूप बहुत ही अनुकूल है Fऔर इसे Bसमाप्त कर देता है), एक किनारे क्यूबाई सही रूप से उन्मुख है यदि यह निम्नलिखित रेगेक्स से मेल खाता है [^RL][^UD]:। एक सही अभिविन्यास आम तौर पर एक के साथ 0और गलत के साथ संकेतित है 1। मूल रूप से Uऔर Dस्टिकर पर दिखाई नहीं दे Rया Lचेहरे, या किसी के किनारों पर Uया Dकिनारे cubies, या वे आवश्यकता के बिना जगह में स्थानांतरित नहीं किया जा सकता है एक FयाB तिमाही मोड़।

<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>

यहां मानदंड इस प्रकार है: प्रत्येक चेहरे में केवल इसके चेहरे से स्टिकर हो सकते हैं, या इसके विपरीत सीधे चेहरे से हो सकते हैं। उदाहरण के लिए, पर Uचेहरा देखते ही हो सकता है Uऔर Dस्टिकर, पर Rचेहरा देखते ही हो सकता है Rऔर Lस्टिकर, पर Fचेहरा देखते ही हो सकता है Fऔर Bयदि प्रत्येक बढ़त टुकड़ा में है स्टिकर, आदि सबसे आसान तरीका है यह सुनिश्चित करने के लिए है की जाँच करने के इसके 'स्लाइस', और इसके 'ऑर्बिट' में प्रत्येक कोने का टुकड़ा। इसके अतिरिक्त, किसी को किनारे-कोने की समानता पर ध्यान देने की आवश्यकता है। यद्यपि, यदि आप केवल कोने की समानता के लिए जाँच करते हैं, तो किनारे की समानता की भी गारंटी है, और इसके विपरीत।

कैसे ट्विस्ट ओरिएंटेशन को प्रभावित करते हैं

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 इनपुट प्रारूप थोड़ा भ्रामक है, मुझे संदेह है कि आपको वहां कोई त्रुटि हो सकती है। मेरे द्वारा हल किए गए हर मामले के समाधान में परिणाम हैं।
प्रिमो

@primo क्या आपके पास गैर-गोल्फ कोड का लिंक प्रकाशित करने का मन होगा?
बिल्लो

12

रूबी, 742 अक्षर

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 BL फू BD RF BR FD FD LBB 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 सेकंड में समाप्त हो गया
एडिट्स

@aditsu हाँ। लेकिन यह भी दृढ़ता से निर्भर करता है कि आप किस रूबी दुभाषिया का उपयोग करते हैं। मेरी मशीन पर आमतौर पर 5 सेकंड से कम समय लगता है।
हावर्ड

मैं वर्तमान में माणिक 1.9.3_p392 का उपयोग कर रहा हूं , इसमें अक्सर 5 सेकंड से भी कम समय लगता है, लेकिन मैं "आमतौर पर" नहीं कह सकता
aditsu

इस इनपुट को आज़माएं:FU FR RU BR DB LD LU LB LF RD DF BU FRU BUR FDR DLB DFL LUB FUL DBR
aditsu

एक अनुरोध: क्या आप U1 U1 U1एकल में दृश्यों को समेकित कर सकते हैं U3?
प्रिमो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.