পাইথন 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)
স্ট্যাকেক্সচেঞ্জ একাধিক সাদা স্থানের সাথে ট্যাবগুলিকে প্রতিস্থাপন করে। প্রযুক্তিগত এই সংস্করণে 549 বাইট রয়েছে। কেবলমাত্র একটি ট্যাবুলেটর দিয়ে 6-10 রেখায় প্রথম দুটি স্পেস প্রতিস্থাপন করুন।
আমার প্রোগ্রামের পিছনে আইডিয়া: আমার প্রথম ধারণাটি ছিল প্রথম শ্বাসকষ্ট। তবে এটি খুব দীর্ঘ সময় নিয়েছে। প্রায় 2 মিনিটের জন্য কঠোর (11 টি সরানো অনুকূল) স্ক্র্যাম্বেলের জন্য। তাই আমি উভয় পক্ষ থেকেই সমস্যাটির কাছে যাওয়ার সিদ্ধান্ত নিয়েছি। আমি দুটি সেট ব্যবহার করি। আমি যথাক্রমে 1,2,3 দূরত্ব সহ সমস্ত রাজ্যগুলি ... স্ক্র্যাবল করতে ও সেট 1 এ সংরক্ষণ করি এবং একই সময়ে 1,2,3 দূরত্ব সহ সমস্ত রাজ্য ... সমাধানযোগ্য অবস্থানে রেখে সেগুলি সংরক্ষণ করি সেট 2 এ। কোনও রাষ্ট্র উভয় সেটে প্রথমবারের মতো সমাধান পেয়েছিল।
এর জন্য আমার সমাধান হওয়া কিউবের রঙগুলি দরকার, যা জানা নেই। 13, 20 এবং 23 অক্ষর বাম, পিছনে এবং নীচের বর্ণটি সংজ্ঞায়িত করে। তবে এই 3 টি রঙ কিউব উপস্থাপনের জন্য যথেষ্ট। আমি কেবল অন্য 3 টি বর্ণ সাদা রঙের সাথে প্রতিস্থাপন করেছি এবং আমি আমার _______LLbbll____dddd হিসাবে সমাধান হওয়া অবস্থার প্রতিনিধিত্ব করতে পারি।
ওহ, এবং অনুমতিগুলি সংক্ষিপ্ত করার জন্য আমি /codegolf//a/34651/29577 থেকে একটি ধারণা ব্যবহার করেছি
অবরুদ্ধ সংস্করণ:
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 সেকেন্ড।