पायथन 2.7: 544 बाइट्स -50% = 272 बाइट्स **
import sys;o=''.join;r=range;a=sys.argv[1];a=o([(' ',x)[x in a[12]+a[19]+a[22]] for x in a]);v={a:''};w={' '*4+(a[12]*2+' '*4+a[19]*2)*2+a[22]*4:''}
m=lambda a,k:o([a[([0x55a5498531bb9ac58d10a98a4788e0,0xbdab49ca307b9ac2916a4a0e608c02,0xbd9109ca233beac5a92233a842b420][k]>>5*i)%32] for i in r(24)])
def z(d,h):
t={}
for s in d[0]:
if s in d[1]:print d[h][s]+d[1-h][s];exit()
n=[d[0][s],'']
for k in r(3):
for j in r(3):s=m(s,k);t[s]=n[h]+'RUF'[k]+" 2'"[(j,2-j)[h]]+n[1-h]
s=m(s,k)
d[0]=t;return d
while 1:v,w=z([v,w],0);w,v=z([w,v],1)
Stackexchange कई व्हाट्सएप के साथ टैब को बदलता है। तो तकनीकी इस संस्करण में 549 बाइट्स हैं। बस सारणी में पहले दो स्थानों को 6-10 लाइनों में बदलें।
मेरे कार्यक्रम के पीछे आइडिया: मेरा पहला विचार एक सांस पहले खोज था। लेकिन इसमें बहुत समय लगा। एक कठिन (11 चाल इष्टतम) हाथापाई के लिए लगभग 2 मिनट। इसलिए मैंने दोनों तरफ से समस्या का फैसला किया। मैं दो सेट का उपयोग करता हूं। मैं क्रमिक रूप से सभी राज्यों की दूरी 1,2,3, ... स्क्रैम्बल के साथ उत्पन्न करता हूं और उन्हें सेट 1 में सहेजता हूं, और साथ ही सभी राज्य 1,2,3 की दूरी के साथ ... हल किए गए राज्य और उन्हें बचाते हैं। सेट 2 में। पहली बार किसी राज्य में दोनों सेट हैं, हमने इसका हल ढूंढा।
इसके लिए मुझे हल किए गए क्यूब के रंगों की आवश्यकता है, जो ज्ञात नहीं हैं। १३, २० और २३ वर्ण बाएं, पीछे और नीचे रंग को परिभाषित करते हैं। लेकिन ये 3 रंग घन का प्रतिनिधित्व करने के लिए पर्याप्त हैं। मैं बस अन्य 3 रंगों को व्हाट्सएप से बदल देता हूं और मैं अपने हल किए गए राज्य को '____ll____bbll____dddd' के रूप में प्रदर्शित कर सकता हूं।
ओह, और क्रमपरिवर्तन को छोटा करने के लिए मैंने /codegolf//a/34651/29577 से एक विचार का उपयोग किया
Ungolfed संस्करण:
import sys
#define permutations for R,U,F
permutation = [[0,7,2,15,4,5,6,21,16,8,3,11,12,13,14,23,17,9,1,19,20,18,22,10],
[2,0,3,1,6,7,8,9,10,11,4,5,12,13,14,15,16,17,18,19,20,21,22,23],
[0,1,13,5,4,20,14,6,2,9,10,11,12,21,15,7,3,17,18,19,16,8,22,23]]
def applyMove(state, move):
return ''.join([state[i] for i in permutation[move]])
scramble = sys.argv[1]
#remove up,front,rigth colors
scramble = ''.join([(' ', x)[x in scramble[12]+scramble[19]+scramble[22]] for x in scramble])
solved = ' '*4+scramble[12]*2+' '*4+scramble[19]*2+scramble[12]*2+' '*4+scramble[19]*2+scramble[22]*4
dict1 = {scramble: ''} #stores states with dist 0,1,2,... from the scramble
dict2 = {solved: ''} #stores states with dist 0,1,2,... from the solved state
moveName = 'RUF'
turnName = " 2'"
for i in range(6):
tmp = {}
for state in dict1:
if state in dict2:
#solution found
print dict1[state] + dict2[state]
exit()
moveString = dict1[state]
#do all 9 moves
for move in range(3):
for turn in range(3):
state = applyMove(state, move)
tmp[state] = moveString + moveName[move] + turnName[turn]
state = applyMove(state, move)
dict1 = tmp
tmp = {}
for state in dict2:
if state in dict1:
#solution found
print dict1[state] + dict2[state]
exit()
moveString = dict2[state]
#do all 9 moves
for move in range(3):
for turn in range(3):
state = applyMove(state, move)
tmp[state] = moveName[move] + turnName[2 - turn] + moveString
state = applyMove(state, move)
dict2 = tmp
मैं परिणाम से बहुत खुश हूं, क्योंकि मैं पायथन के लिए काफी नया हूं। यह मेरे पहले अजगर कार्यक्रमों में से एक है।
संपादित करें: आधा साल बाद: 427 - 50% = 213.5
पायथन में और गोल्फिंग में थोड़ा अधिक अनुभव प्राप्त किया। इसलिए मैंने अपने मूल कोड को संशोधित किया और 100 से अधिक चरित्र बचा सकता था।
import sys;o=''.join;a=sys.argv[1];d=[{o((' ',x)[x in a[12]+a[19]+a[22]]for x in a):[]},{' '*4+(a[12]*2+' '*4+a[19]*2)*2+a[22]*4:[]}]
for h in[0,1]*6:
for s,x in d[h].items():
for y in range(12):
d[h][s]=x+[y-[1,-1,1,3][h*y%4]];
if s in d[1-h]:print o('RUF'[x/4]+" 2'"[x%4]for x in d[0][s]+d[1][s][::-1]);exit()
s=o(s[ord(c)-97]for c in'acahabcdnpbfegefhugiovjgqkciljdeklflmmmnnvoopxphrqdjrrbsstttuuqsviwwwkxx'[y/4::3])
मैं मूल रूप से ठीक उसी दृष्टिकोण का उपयोग करता हूं। सबसे बड़ा परिवर्तन यह है, कि मैं अब किसी फ़ंक्शन को परिभाषित नहीं करता हूं। के बजाय
def z(d,h):
for s in d[0]:
if s in d[1]:...
while 1:v,w=z([v,w],0);w,v=z([w,v],1)
मैं कर सकता हूँ
for h in[0,1]*6:
for s in d[h]:
if s in d[1-h]:...
साथ ही मैंने चाल लमडा को थोड़ा बदल दिया। पहले शोर्ट, और फिर सीधे कोड को एकीकृत किया, क्योंकि फ़ंक्शन कॉल केवल एक बार दिखाई देता है।
मैं प्रत्येक राज्य के लिए 0 और 11 के बीच संख्याओं की एक सूची रखता हूं, जो चालों का प्रतिनिधित्व करता है, बजाय एक चाल युक्त स्ट्रिंग के। संख्याएं बहुत अंत में परिवर्तित हो जाती हैं।
इसके अलावा, मैंने दो फॉर-लूप 'for k in r(3):for j in r(3):
को एक में जोड़ दिया for y in r(12)
। इसलिए मुझे भी मूव्स करने होंगे U4, R4, F4
। बेशक इस तरह के एक कदम सबसे कम समाधान में प्रकट नहीं होता है, इसलिए " 2'"[x%4]
काम करता है। (यदि x % 4 == 3
, कोई अपवाद सीमा से बाहर का सूचकांक होगा)
यह थोड़ा तेज भी है, क्योंकि मैं पहले दूसरे सेट में प्रवेश की तलाश में हूं। 11 चाल के समाधान के लिए लगभग 0.5 सेकंड।