แก้ปัญหาลูกบาศก์รูบิค (Rubiks)


16

งานของคุณ

.. คือทำในสิ่งที่ Brian Fantana ไม่สามารถทำได้และแก้ไข Cube 2x2x2 Rubik

กระเป๋าพกพา - แอนกอร์แมน

เลย์เอาต์

- -   A B   - -   - -
- -   C D   - -   - -

E F   G H   I J   K L
M N   O P   Q R   S T

- -   U V   - -   - -
- -   W X   - -   - -

และจะมอบให้คุณผ่าน stdin หรือบรรทัดคำสั่ง (ตัวเลือกของคุณ - โปรดระบุในคำตอบของคุณ) ในรูปแบบ:

ABCDEFGHIJKLMNOPQRSTUVWX

โปรดทราบว่าโฆษณาประกอบ U-face (up), EFMN ประกอบ L-face (ซ้าย), GHOP ประกอบ F-face (ด้านหน้า), IJQR ประกอบ R-face (ขวา), KLST ประกอบ B-face (ด้านหลัง) และ UX ประกอบไปด้วย D-face (down)

จะมีอักขระที่ไม่ซ้ำกันหกตัวที่แสดงถึงแต่ละสี แต่อาจแตกต่างกันไปดังนั้นเตรียมพร้อมสำหรับการรวมกันของอักขระ ascii 6 ตัวที่จะใช้สำหรับแต่ละสี

ข้อมูลจำเพาะ

  • รหัสของคุณควรแสดงทางออกโดยใช้ใบหน้าขวา (R), บน (U) และ Front (F) เท่านั้นและควรใช้สัญกรณ์มาตรฐาน: R, R ', R2, U, U', U2, F, F ', F2 คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่ ข้อ จำกัด ของชุดย่อย RUF เป็นมาตรฐานสำหรับ 2x2 คิวบ์ (เคล็ดลับ: ปฏิบัติต่อมุมล่างซ้ายหลังเป็นฐานคงที่เพื่อใช้งานได้)
  • รหัสของคุณจะต้องสามารถแก้ไขพีชคณิตได้ทั้งหมด
  • แต่ละวิธีควรใช้เวลาน้อยกว่า 30 วินาที
  • แต่ละทางออกควรน้อยกว่า 30 ท่า
  • โบนัสจะมอบให้ -20% สำหรับโซลูชันที่ให้คำตอบน้อยกว่า 20 การเคลื่อนไหวเสมอ (โปรดโฆษณาในคำตอบของคุณเพื่อให้ฉันสามารถตรวจสอบได้อย่างละเอียด)
  • จะได้รับโบนัส -50% สำหรับรหัสที่ให้ทางออกที่ดีที่สุดเสมอ - อีกครั้งโปรดโฆษณาในคำตอบของคุณ
  • การแก้ปัญหาจะต้องไม่มีการเคลื่อนไหวติดต่อกันสองครั้งบนใบหน้าเดียวกันเพราะสามารถรวมเข้าด้วยกันเป็นการเคลื่อนไหวเดียว
  • โซลูชันสามารถเลือกที่มีพื้นที่เดียว - และพื้นที่เดียวเท่านั้น - ระหว่างการย้ายแต่ละครั้ง
  • ลำดับโซลูชันทั้งหมดหากจำเป็นอาจมีอยู่ในวงเล็บเครื่องหมายอัญประกาศวงเล็บเหลี่ยมหรือ carets แต่ไม่อนุญาตเอาท์พุทภายนอกอื่น ๆ
  • โปรดระบุรหัสของคุณในรูปแบบความคิดเห็นสั้น ๆ หรือคำอธิบายอย่างละเอียดเกี่ยวกับรหัสของคุณ
  • ไม่มีการใช้ไฟล์ภายนอก ซึ่งรวมถึงอินเทอร์เน็ตตารางข้อมูลและไลบรารี / แพ็คเกจที่สร้างขึ้นสำหรับปัญหาประเภทนี้
  • รหัสที่สั้นที่สุดนับเป็นไบต์ชนะ
  • ผู้ชนะได้รับการแต่งตั้งเมื่อวันพุธที่ (30 กรกฎาคม 2014)

20
เรามี 2x2 และ3x3และ4x4แต่ฉันยังคงรอการท้าทาย 1x1 สำหรับโอกาสที่จะส่องแสง ฉันมีอัลกอริทึมที่สมบูรณ์แบบ!
Doorknob

นี่คือตัวแก้อักขระ ~ 500 ใน K ซึ่งสร้างโซลูชันที่เหมาะสมที่สุด (= = สั้นที่สุด): speedolving.com/forum/…
Jakube

30 วินาทีน่าจะเพียงพอที่จะดุร้ายโดยใช้ Dijkstra: มีเพียง 3674160 ตำแหน่ง
Peter Taylor

2
1. ฉันคิดว่าไม่มีข้อ จำกัด ในช่องว่างในผลลัพธ์ 2. เพื่อให้เป็นไปตามวัตถุประสงค์คุณควรกำหนดโบนัสสำหรับการแก้ปัญหาที่น้อยกว่า 20 การเคลื่อนไหวแทนที่จะปล่อยให้มันเป็น "การตัดสินใจ"
เลเวลริเวอร์เซนต์

@steveverrill แก้ไขมัน เพิ่มข้อกำหนดช่องว่างด้วย ขอบคุณ!
Kyle McCormick

คำตอบ:


11

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 ครั้ง


2
โหวตขึ้นสำหรับการใช้ bfs สองทิศทาง - อัลกอริทึมการค้นหาที่ฉันโปรดปราน (ถัดจาก IDA *) หากอนุญาตให้เวลาฉันจะทดสอบในเวลาไม่กี่ชั่วโมงเพื่อให้เกิดประโยชน์สูงสุด นอกจากนี้ฉันไม่ได้ตระหนักว่าคุณไม่จำเป็นต้องใช้สี U / R / F เพื่อไขปริศนา ทำได้ดีมาก!
Kyle McCormick

ผ่านการทดสอบ 20 กรณีของฉันเพื่อความถูกต้อง & เพิ่มประสิทธิภาพ
Kyle McCormick

ดีมาก .. ช่วยฉันในการติดตั้งเร็วกว่า 24!
bfs

จริงแล้ว '____ll____bbll____dddd' ควรเป็น '____ll____bbll____bbdddd'
RE60K

7

C, 366 - โบนัสที่ดีที่สุด 50% = 183

char c[99],t[3][26]={"ZGONFZCPTEZBHUMZ","ZIQPHZRUGAZJWOCZ","ZACB@ZJHFDZKIGEZ"};r=20;f(int m,int n){int e,i,j;for(i=4;i--;){for(j=15;j--;)c[t[n][j+1]]=c[t[n][j]];c[m]="FRU"[n],c[m+1]="4'2 "[i],c[m+2]=0;for(e=0,j=68;j<76;j++) e+= (c[j]!=c[j+8]) + (c[j]!=c[j^1]);i&&e&&e<45-m*2&m<r?f(m+2,(n+1)%3),f(m+2,(n+2)%3):e||(puts(c),r=m);}}main(){scanf("%s",c+64);f(0,2),f(0,1),f(0,0);}

เมื่อใช้การเรียกซ้ำโปรแกรมจะค้นหาต้นไม้ที่มีความเคลื่อนไหวสูงสุด 11 ครั้ง (ความยาวสูงสุดของโซลูตรอนที่ดีที่สุดตามhttp://en.wikipedia.org/wiki/Pocket_Cubeและหน้าเว็บที่กล่าวถึงด้านล่าง) และเมื่อพบวิธีแก้ปัญหา มันพิมพ์มัน (ความยาวสูงสุด 22 ตัวอักษรติดตามโดยฟังก์ชั่นการโต้แย้งm ) คำสั่งที่ใช้เป็นชนิดของคำสั่งพจนานุกรมซึ่งเส้นทางทั้งหมดที่เริ่มต้น U, U2, U 'จะถูกค้นหาก่อนที่จะค้นหาเส้นทางใด ๆ ที่เริ่มต้นด้วย R หรือ F ดังนั้นจึงไม่จำเป็นต้องหาทางออกที่ดีที่สุดก่อน

เมื่อพิมพ์โซลูชันrทำเท่ากับmซึ่งทำให้แน่ใจว่าจะพิมพ์เฉพาะโซลูชันที่เท่ากันหรือสั้นกว่าเท่านั้นหลังจากนั้น การใส่r=m-2ค่าใช้จ่ายเพิ่ม 2 ตัวอักษร แต่ทำให้มั่นใจได้ว่าจะมีการพิมพ์เพียงหนึ่งคำตอบของความยาวแต่ละตัว หากคุณต้องการให้แสดงเฉพาะโซลูชันที่ดีที่สุดโซลูชันที่ดีที่สุดที่พบจะต้องถูกจัดเก็บไว้ในตัวแปรและทางออกที่ดีที่สุดที่พิมพ์ในตอนท้ายของโปรแกรม (ซึ่งจะมีราคาประมาณ 15 อักขระเพิ่มเติม)

อินพุตถูกอ่านในอาร์เรย์c[]จากดัชนี 64 เป็นต้นไป นี่เป็นสิ่งจำเป็นเพื่อที่จะใช้ตัวอักษรใน movetable สัญลักษณ์@ผ่านWจะถูกนำมาใช้แทนผ่าน X ต่อคำถามที่ว่าเพราะมันเป็นสิ่งจำเป็นที่จะเริ่มต้นในจำนวนคู่ที่จะทำให้การทดสอบสำหรับการทำงานการแก้ปัญหา c['Z']ยังใช้สำหรับการจัดเก็บชั่วคราวเพราะเพื่อที่จะทำการหมุน 4 เท่าจำเป็นต้องมีการมอบหมายทั้งหมด 5 ครั้ง เนื่องจากส่วนแรกของc[]ไม่ได้ใช้จะสามารถเก็บโซลูชัน (ซึ่งถูกยกเลิกด้วยศูนย์ไบต์เช่นสตริง C ทั้งหมด)

for(i..)ผ่านไปลำดับที่ 4 quarterturns nของใบหน้าที่ระบุไว้โดย

เป็นครั้งแรกที่จะดำเนินการแลกเปลี่ยนที่เกิดขึ้นจริงตามตารางfor(j..)t[]

เพื่อทดสอบว่าแก้ปัญหาคิวบ์ได้หรือไม่จำเป็นต้องตรวจสอบใบหน้าทั้งสี่ด้าน ชิ้นส่วนของ URF และ DFR สามารถแยกความแตกต่างได้แม้ว่าจะถอดสติ๊กเกอร์ U และ D ออกแล้วเนื่องจากชิ้นส่วนหนึ่งอ่าน XRF ในทิศทางตามเข็มนาฬิกาและ XFR อื่น ๆ หากทั้งสองชิ้นมีการสับเปลี่ยนกันเพื่อให้คุณแสดงบนใบหน้าคว่ำและในทางกลับกันสี F จะแสดงบนใบหน้าขวาและในทางกลับกัน

ที่สองfor(j..)นับจำนวนไม่ตรงกันในใบหน้าทั้งสี่ด้าน ตัวอย่างเช่นสำหรับด้านหน้าจะเปรียบเทียบ G & O, H & P และ G & H (สองครั้ง) หากe== 0 ลูกบาศก์จะได้รับการแก้ไข หากe<9 หรือe<13 อาจเป็นไปได้ที่จะแก้ปัญหาลูกบาศก์ในการเคลื่อนที่ครั้งต่อไปหรือการเคลื่อนไหว 2 ครั้งตามลำดับ ไม่อย่างนั้นมันเป็นไปไม่ได้ที่จะแก้ปัญหาลูกบาศก์ในจำนวนการเคลื่อนไหวนี้ เพื่อประหยัดเวลาฮิวริสติกนี้ใช้ในการตัดต้นไม้การค้นหาและหลีกเลี่ยงการเสียเวลาในสาขาที่มีความลึก 10 หรือ 11 สาขาซึ่งจะไม่ประสบผลสำเร็จ e<45-m*2แสดงเป็นสูตรนี้จะกลายเป็น

รหัสที่ไม่ดี

char c[99],t[3][26]={"ZGONFZCPTEZBHUMZ","ZIQPHZRUGAZJWOCZ","ZACB@ZJHFDZKIGEZ"};
r=20;                                                       //All moves are output as 2 characters. The index of the last move of the longest solution (11 moves) shall be 20.

f(int m,int n){                                             //perform a cycle through four 1/4 turns of the face specified in n. The index of the move reported in the solution is m.
  int e,i,j;                                                //e is for counting mismatches. i loops through the four 1/4 turns. j performs other functions.
  for(i=4;i--;){

    for(j=15;j--;)c[t[n][j+1]]=c[t[n][j]];                  //A 1/4 turn is performed as three 4-sticker rotations of the type z=a;a=b;b=c;c=d;d=z using the data in the movetable t[][]

    c[m]="FRU"[n],c[m+1]="4'2 "[i],c[m+2]=0;                //Write to the output in c[] the face to be turned and the number of 1/4 turns. Terminate with a zero byte to overwrite any longer solution that may have been found before. 

    for(e=0,j=68;j<76;j++)e+=(c[j]!=c[j+8])+(c[j]!=c[j^1]); //Compare each sticker of the top row of the side faces (64+4 through 64+11) with the stickers below and beside it. Count the number of mismatches.

    i && e && e<45-m*2 & m<r?                               //if the number of 1/4turns is not 4 AND the cube is not solved AND the heuristic (as described in the text) is good AND a shorter solution has not already been found,
      f(m+2,(n+1)%3), f(m+2,(n+2)%3):                       //deepen the search to another faceturn of the other two faces. 
      e||(puts(c),r=m);                                     //otherwise, if a solution has been found, print the solution and reduce the value of r to the new max solution length.
  } 
}

main(){
  scanf("%s",c+64);                                         //scan in the current cube state to c[] at index 64.
  f(0,2),f(0,1),f(0,0);                                     //call f() three times to search for solutions beginning with U R and F.
}

ประสิทธิภาพ

โปรแกรมได้รับการทดสอบด้วยรูปแบบ 1 ถึง 13 ที่http://www.jaapsch.net/puzzles/cube2.htm

ผลลัพธ์ดังต่อไปนี้ให้เวลากับเครื่องของฉันเพื่อค้นหาวิธีแก้ปัญหาที่ดีที่สุดทั้งหมด (สำหรับผู้ที่มีความอยากรู้อยากเห็น) นอกจากนี้สำหรับตำแหน่งที่ซับซ้อนยิ่งขึ้น สำหรับการกำหนดเวลานี้จะให้ทั้งสองเพื่อค้นหาวิธีแก้ไขปัญหาแรกและสำหรับโปรแกรมที่จะยุติ วิธีแก้ปัญหาที่ให้ (ซึ่งโดยทั่วไปจะแตกต่างจากวิธีแก้ปัญหาที่ได้รับจากการย้อนกลับของเครื่องกำเนิดไฟฟ้าในหน้าเชื่อมโยง) ได้รับการตรวจสอบด้วยเครื่องจำลองลูกบาศก์ออนไลน์

U 4 (1 move) horizontal flags (not mirror symmetric)
1 solution 1 sec

U2 (1 move) 4 horizontal flags (mirror symmetric)
1 solution 1 sec

F2 R2 F2 (3 moves) 4 vertical flags  
UUUULRBFRLFBLRBFRLFBDDDD 2 solutions 1 sec

U2 F2 R2 U2 (4 moves) Supertwist; 6 flags
DDUURRBFRRFBLLBFLLFBUUDD 3 solutions 1 sec

U F2 U2 R2 U (5 moves) 4 vertical flags, 2 checkerboards
UDDULBRFRFLBLBRFRFLBUDDU 2 solutions 1 sec

R2 F2 R2 U2 (4 moves) 4 checkerboards
UUUURLFBLRBFLRBFRLFBDDDD 4 solutions 1 sec

R U2 R' F2 R U' R2 U F2 U' (10 moves) Cube in cube
FFFUDDRFRULLLDRRUULBBBDB 18 solutions 26 sec; 1 solution U F2U'R2U R'F2R U2R' 1,13 sec 

R F U' R2 U F' R U F2 R2 (10 moves) Cube in cube 2
DDDUFFLFRBRRLFLLBBRBUUDU 8 solutions 28 sec; 1 solution R F U'R2U F'R U F2R2 12,21 sec 

U R F2 U R F2 R U F' R (10 moves)3-Cycle
UFFULDRFRULBLLFRURBBDBDD 45 solutions 26 sec; 1 solution U R'F U'F'R'F2U R F2 8,14 sec 

U R U' R2 U' R' F' U F2 R F' (11 moves) Column turn
UUUDLLFRFRBBLLFRFRBBDUDD many solutions 29 sec; 1 solution U R U'F U2R F'R'F'U2F' 3,27 sec 

F' U R' F2 U' R F U R2 U R' (11 moves)Corner swap
UUUURLFBLRBFLLFFRRBBDDDD 29 sec 24 solutions; 1 solution R U'F R U'R2U'F'R'U F2 12,28 sec

U F2 U' (3 moves) Zig-zag 
UDUDLLFRFFLBLBRRFRBBUUDD 1 solution 1 sec 

U' F2 U2 R2 U' F2 U2 R2 U' (9 moves) 2 Checkerboards, 4 L
DUUDLLFBRRBFLRFFRLBBUDDU 8 solutions 13 sec; 1 solution U F2U2R2U R2U2F2U' 1,5 sec

ฟังดูเข้าท่า. ฉันชอบที่จะเห็นการแข่งขันอย่างใกล้ชิดที่นี่
Kyle McCormick

@ KyleMcCormick ในที่สุดโปรแกรมของฉันก็เสร็จสิ้นและทำงานได้ดี แต่ฉันเห็นว่าคุณเหนื่อยกับการรอและยอมรับคำตอบอื่น ๆ มันดีกว่าการโพสต์เมื่อ 2 วันที่แล้วซึ่งมีปัญหา (หันหน้าไปทางผิด) นอกจากนี้การใช้ฮิวริสติกถึง 2 ระดับก็ช่วยเพิ่มความเร็ว มันยังคงเอาท์พุทวิธีแก้ปัญหาหลายอย่าง แต่ทางออกสุดท้ายรับประกันได้ว่าจะดีที่สุด (เพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงผลลัพธ์ที่เป็นไปได้ในข้อความ) มันสั้นกว่าการส่งอื่น ๆ มาก หากคุณมีปัญหาใด ๆ ในรูปแบบผลลัพธ์แจ้งให้เราทราบ
เลเวลริเวอร์เซนต์

358 ไบต์ผ่านการตีกอล์ฟพื้นฐาน
MD XF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.