Python 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 ด้วยตาราง
แนวคิดเบื้องหลังโปรแกรมของฉัน: ความคิดแรกของฉันคือการค้นหาครั้งแรก แต่สิ่งนี้ใช้เวลานานเกินไป ประมาณ 2 นาทีเพื่อช่วงชิงการเดินทางที่ยาก (11 ย้ายที่ดีที่สุด) ดังนั้นฉันจึงตัดสินใจที่จะเข้าถึงปัญหาจากทั้งสองฝ่าย ฉันใช้สองชุด ฉันสร้างตามลำดับทุกรัฐด้วยระยะทาง 1,2,3, ... ไปที่ช่วงชิงและบันทึกไว้ใน set1 และในขณะเดียวกันทุกรัฐด้วยระยะทาง 1,2,3, ... สู่สถานะที่แก้ไขแล้วและบันทึกไว้ ใน set2 ครั้งแรกที่รัฐอยู่ในทั้งสองชุดเราพบวิธีแก้ปัญหา
สำหรับสิ่งนี้ฉันต้องการสีของคิวบ์ที่ถูกแก้ไขซึ่งไม่เป็นที่รู้จัก อักขระ 13, 20 และ 23 กำหนดสีซ้ายกลับและลง แต่สีทั้งสามนี้ก็เพียงพอที่จะใช้แทนลูกบาศก์ได้ ฉันเพียงแค่แทนที่ 3 สีอื่น ๆ ด้วย whitespaces และฉันสามารถแสดงสถานะที่แก้ไขแล้วของฉันเป็น '____ll____bbll____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
ฉันค่อนข้างพอใจกับผลลัพธ์เพราะฉันค่อนข้างใหม่กับ Python นี่เป็นหนึ่งในโปรแกรมหลามแรกของฉัน
แก้ไข: ครึ่งปีต่อมา: 427 - 50% = 213.5
มีประสบการณ์เพิ่มเติมเล็กน้อยใน Python และในการเล่นกอล์ฟ ดังนั้นฉันจึงแก้ไขรหัสเดิมและสามารถบันทึกได้มากกว่า 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
จะมีข้อยกเว้นดัชนีอยู่นอกช่วง)
นอกจากนี้ยังเร็วกว่าเล็กน้อยเนื่องจากฉันค้นหารายการในชุดที่สองก่อนหน้านี้ ประมาณ 0.5 วินาทีสำหรับการเคลื่อนที่ 11 ครั้ง