จำลองลูกบาศก์รูบิค


39

ลูกบาศก์ของรูบิคมี 6 สี ได้แก่ แดงส้มเหลืองขาวน้ำเงินและเขียว ใบหน้าสีแดงและส้มเหลืองและขาวและสีน้ำเงินและสีเขียวอยู่ตรงกันข้ามกัน

สุทธิจากลูกบาศก์ของ Rubik ที่แก้ไขแล้วจะมีลักษณะเช่นนี้:

 Y
BRGO
 W

และกระเบื้องมีลักษณะดังนี้:

      Y Y Y
      Y Y Y
      Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
      W W W
      W W W
      W W W

ท้าทาย

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

อินพุตจะเป็นการหมุน (และตัวแก้ไขเสริม) สัญลักษณ์การหมุนจะเป็นดังนี้: U(p), L(eft), F(ront), R(ight), B(ack), D(เจ้าของ); 2(สองครั้ง) 'หรือi (inverse)

การหมุนปกติทั้งหมดจะเป็น 90 °ตามเข็มนาฬิกาส่วนที่ตรงกันข้ามจะเป็นทวนเข็มนาฬิกา

คำอธิบายเกี่ยวกับ clockwiseness : ลองนึกภาพลูกบาศก์ในขณะที่คุณกำลังมองหาใบหน้าสีแดงและใบหน้าสีเหลืองอยู่ด้านบน จากนั้นหมุนคิวบ์เพื่อให้ใบหน้าที่โปรแกรมจะหมุนหน้าคุณ นี่คือวิธีที่นาฬิกาจะทำงานได้ดี (ยกเว้นด้านหลังคุณจะหมุนลูกบาศก์ในแนวนอนในกรณีนั้น)

อินพุต

อินพุตจะเป็นรายการการเคลื่อนไหว

เอาท์พุต

ASCII art ที่แสดงถึงคิวบ์หรืออิมเมจของเน็ตของลูกบาศก์

ตัวอย่าง

อินพุต : (ว่าง)

ผลผลิต :

      Y Y Y
      Y Y Y
      Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
      W W W
      W W W
      W W W

อินพุต : U(ขึ้น)

ผลผลิต :

      Y Y Y
      Y Y Y
      Y Y Y
R R R G G G O O O B B B
B B B R R R G G G O O O
B B B R R R G G G O O O
      W W W
      W W W
      W W W

อินพุต : U'หรือUi(ตรงกันข้าม)

ผลผลิต :

      Y Y Y
      Y Y Y
      Y Y Y
O O O B B B R R R G G G
B B B R R R G G G O O O
B B B R R R G G G O O O
      W W W
      W W W
      W W W

อินพุต : U2(เพิ่มขึ้นเป็นสองเท่า)

ผลผลิต :

      Y Y Y
      Y Y Y
      Y Y Y
G G G O O O B B B R R R
B B B R R R G G G O O O
B B B R R R G G G O O O
      W W W
      W W W
      W W W

อินพุต : L'(เหลือทางกลับกัน)

ผลผลิต :

      R Y Y
      R Y Y
      R Y Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
      O W W
      O W W
      O W W

อินพุต : R(ขวา)

ผลผลิต :

      Y Y R
      Y Y R
      Y Y R
B B B R R W G G G Y O O
B B B R R W G G G Y O O
B B B R R W G G G Y O O
      W W O
      W W O
      W W O

อินพุต : U2 L' D(ดับเบิลขึ้น, ซ้ายผกผัน, ลง)

ผลผลิต :

      O Y Y
      R Y Y
      R Y Y
G B B W O O B B B R R Y
G B B W R R G G G O O Y
O O Y G B B W R R G G G
      R O O
      W W W
      W W W

กฎระเบียบ

  • ไม่อนุญาตช่องโหว่
  • นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ที่แก้ปัญหาจะชนะ


เราสามารถเลือกที่จะเลือกปรับทิศทางคิวบ์ใหม่ (เช่นมี White U, Orange F และ Green R) ได้หรือไม่?
primo

ใช่แน่นอนตราบใดที่แยกและจดจำได้
betseg

เราจำเป็นต้องให้การสนับสนุนS, E, M, x, y, z, u/ Uw, d/ Dw, r/ Rw, l/ Lw, f/ Fw, b/ Bwย้ายเช่นกัน? หรือเพียงเริ่มต้น: U, D, R, L, F, Bและทวนเข็มนาฬิกาที่แตกต่างของพวกเขาด้วยเครื่องหมายวรรคตอน ( ')? นอกหัวข้อ: ฉันสงสัยอยู่เสมอกับคำถามที่เกี่ยวข้องกับ Cube ของ Rubik คุณเป็นนักสะสมของ Twisty Puzzles หรือไม่?
Kevin Cruijssen

3
@KevinCruijssen แดงว่าเป็นจำนวนมากของปริศนา
mbomb007

คำตอบ:


14

Ruby, 370 339 305 ไบต์

แก้ไขล่าสุด: บันทึกสองสามไบต์โดยจัดเรียงสูตรการพล็อตใหม่และลบวงเล็บเหลี่ยมที่ไม่จำเป็นออก การประหยัดครั้งยิ่งใหญ่ด้วยการเขียนการสร้างคิวบ์ใหม่ - ฉันไม่เคยรู้ว่า Ruby มี builtin สำหรับผลิตภัณฑ์ Cartesian!

->s{q=[-66,0,71].product [-87,0,89],[-79,0,82]
s.map{|c|m="LDBRUF".index c[0];e=m/3*2-1
c.sub(/[i']/,"33").chars{q.map{|j|j[m%=3]*e>0&&(j[m-2],j[m-1]=j[m-1]*e,-j[m-2]*e)}}}
t=[" "*12]*9*$/
q.map{|r|a,b,c=r.map{|i|i<=>0}
3.times{|i|r[i]!=0&&t[56+[a*3-a*c-d=b*13,a-d*3+d*c,3-d-c*3+c*a][i]]=r[i].abs.chr}}
t}

ฟังก์ชั่นไม่ระบุชื่อ

ยอมรับอาเรย์ของสตริงแต่ละอันแสดงถึงหนึ่งเทิร์นเดียว (สตริงเดียวที่มีช่องว่างระหว่างแต่ละเทิร์นเป็น 6 ไบต์เพิ่มเติม)

ส่งคืนสตริงสี่เหลี่ยม 9x12

คำอธิบายสั้น ๆ

นี่ขึ้นอยู่กับแนวคิดจากคำตอบของฉันสำหรับคำถามนี้ซึ่งตามมาจากแนวคิดที่คล้ายกันโดย Jan Dvorak

บรรทัดแรกสร้างอาร์เรย์ 27 องค์ประกอบซึ่งแทน 27 cubies Cubie แต่ละตัวจะถูกแสดงด้วยเวกเตอร์ 3 มิติซึ่งเครื่องหมายแสดงถึงตำแหน่งปัจจุบันและขนาดของพิกัดแต่ละพิกัดแสดงรหัส ascii สำหรับสีของสติกเกอร์

ตัวอย่างการย้าย: สำหรับ R สำหรับแต่ละ cubie ตรวจสอบว่าพิกัด x เป็น> 0 และถ้าหมุน 90 องศาด้วยการสลับพิกัด y และ z และสลับเครื่องหมายของหนึ่งในนั้น

ใช้ช่องว่างขนาด 9x12 และพล็อตของลูกบาศก์ สำหรับแต่ละ cubie และแกนเราจะตรวจสอบว่ามีสติกเกอร์อยู่หรือไม่ (ประสานงานในแกนนั้นไม่ใช่ศูนย์) และหาตำแหน่งที่จะไป จากนั้นเราจะนำพิกัดและดำเนินการ.abs.chrเพื่อเปลี่ยนตัวเลขให้เป็นอักขระที่ต้องการและทำการพล็อต

Ungolfed ในโปรแกรมทดสอบ (ต่อการแก้ไข 339 ไบต์)

f=->s{

  q=(0..26).map{|i|                         #Build an array of 27 cubies
    [[-66,0,71][i%3],                       #x coordinate B.G
     [-87,0,89][i/3%3],                     #y coordinate Y.W
     [-79,0,82][i/9]]                       #z coordinate O.R
  }

  s.map{|c|                                 #For each move in the input array
    m="LDBRUF".index(c[0]);e=m/3*2-1        #m=face to move. e=-1 for LDB, +1 for RUF.
    c.sub(/[i']/,"33").chars{               #Substitute "i" and "'" for "33" so chars in string = clockwise 1/4 turns required. For each char...
      q.map{|j|j[m%=3]*e>0&&                #...and each cubie, m%3 tells the relevant axis. if coordinate*e>1 rotate the cubie 1/4 turn.
        (j[m-2],j[m-1]=j[m-1]*e,-j[m-2]*e)} #Swap other two axes and change sign of one. e performs sign change if necessary for LDB.
    }
  }

  t=[" "*12]*9*$/                           #Make an array of 9 strings of 12 spaces, then make a single string by joining them with newlines
  q.map{|r|                                 #For each cubie
    a,b,c=r.map{|i|i<=>0}                   #make a normalised (-1,0,1) copy of each coordinate.
    d=b*13                                  #13 chars per line, d will be useful for plotting to the correct line of the output.
    3.times{|i|                             #For each of the 3 coordinates of the cubie
      r[i]!=0&&                             #if zero, sticker doesn't exist (edges and centres have <3 stickers.) If not zero plot the sticker. 
      t[[56-d+a*3-a*c,                      #Calculate position on plot for x (L/R faces),
         56-d*3+d*c+a,                      #Calculate position on plot for y (D/U faces),
         59-d-c*3+c*a][i]]=                 #Calculate position on plot for z (B/F faces). Select the correct axis. 
      r[i].abs.chr                          #Convert the coordinate to a character and assign to the correct space on the output plot.
    }
  }
t}                                          #Return the output string.

puts f[gets.chomp.split]

เอาท์พุต

Checkerboard
U2 D2 F2 B2 L2 R2
   YWY
   WYW
   YWY
BGBRORGBGORO
GBGOROBGBROR
BGBRORGBGORO
   WYW
   YWY
   WYW

6-spot
U D' R L' F B' U D'
   RRR
   RYR
   RRR
WWWGGGYYYBBB
WBWGRGYGYBOB
WWWGGGYYYBBB
   OOO
   OWO
   OOO

Testcase
U2 L' D
   OYY
   RYY
   RYY
GBBWOOBBBRRY
GBBWRRGGGOOY
OOYGBBWRRGGG
   ROO
   WWW
   WWW

11

Javascript (ES5), 1615 ไบต์

function m(a){b=[];b[0]=a[6];b[2]=a[0];b[8]=a[2];b[6]=a[8];b[1]=a[3];b[5]=a[1];b[7]=a[5];b[3]=a[7];b[4]=a[4];return b}function q(a,b){c=[];c[0]=b[0];c[1]=b[1];c[2]=a[2];c[3]=b[3];c[4]=b[4];c[5]=a[5];c[6]=b[6];c[7]=b[7];c[8]=a[8];return c}function r(a){var b=[];b[0]=m(a[0]);b[1]=q(a[2],a[1]);b[4]=q(a[1],a[4]);b[3]=q(a[4],a[3]);b[2]=q(a[3],a[2]);b[5]=a[5];return b}function x(a){var b=[];b[0]=m(a[0]);b[1]=a[2];b[2]=a[3];b[3]=a[4];b[4]=a[1];b[5]=m(m(m(a[5])));return b}function y(a){var b=[];b[0]=a[4];b[1]=m(a[1]);b[2]=a[0];b[3]=m(m(m(a[3])));b[4]=a[5];b[5]=a[2];return b}function s(a){a=a.replace(/F2/,"F F");a=a.replace(/R2/,"R R");a=a.replace(/U2/,"U U");a=a.replace(/D2/,"D D");a=a.replace(/B2/,"B B");a=a.replace(/L2/,"L L");a=a.replace(/F'/,"F F F");a=a.replace(/R'/,"R R R");a=a.replace(/U'/,"U U U");a=a.replace(/D'/,"D D D");a=a.replace(/B'/,"B B B");a=a.replace(/L'/,"L L L");a=a.replace(/F/,"y y y R y");a=a.replace(/L/,"y y R y y");a=a.replace(/U/,"x y R y y y x x x");a=a.replace(/B/,"y R y y y");a=a.replace(/D/,"x y y y R y x x x");a=a.split(" ");for(b=["RRRRRRRRR".split(""),"WWWWWWWWW".split(""),"GGGGGGGGG".split(""),"YYYYYYYYY".split(""),"BBBBBBBBB".split(""),"OOOOOOOOO".split("")],c=0;c<a.length;++c)"x"==a[c]?b=x(b):"y"==a[c]?b=y(b):"R"==a[c]&&(b=r(b));return p(b)}function p(a){for(var b="",c=0;3>c;++c)b+="\n   "+a[1][3*c+0]+a[1][3*c+1]+a[1][3*c+2];for(c=0;3>c;++c)b+="\n"+a[5][3*c+0]+a[5][3*c+1]+a[5][3*c+2]+a[2][3*c+0]+a[2][3*c+1]+a[2][3*c+2]+a[0][3*c+0]+a[0][3*c+1]+a[0][3*c+2]+a[4][3*c+0]+a[4][3*c+1]+a[4][3*c+2];for(c=0;3>c;++c)b+="\n   "+a[3][3*c+0]+a[3][3*c+1]+a[3][3*c+2];return b}

Ungolfed:

function m(fac){ //Turn a face
    //0 1 2
    //3 4 5
    //6 7 8

    var fac2=[];
    fac2[0]=fac[6];
    fac2[2]=fac[0];
    fac2[8]=fac[2];
    fac2[6]=fac[8];

    fac2[1]=fac[3];
    fac2[5]=fac[1];
    fac2[7]=fac[5];
    fac2[3]=fac[7];

    fac2[4]=fac[4];

    return fac2;
}

function q(face1,face3){ //Swap right third of two faces
    var face2=[];
    face2[0]=face3[0];
    face2[1]=face3[1];
    face2[2]=face1[2];
    face2[3]=face3[3];
    face2[4]=face3[4];
    face2[5]=face1[5];
    face2[6]=face3[6];
    face2[7]=face3[7];
    face2[8]=face1[8];
    return face2;
}

function r(state){ //Apply a R move
    var state2=[];
    state2[0]=m(state[0]);
    //Swap right set of Front, Up, Back, Down (2,1,4,3);

    state2[1]=q(state[2],state[1]);
    state2[4]=q(state[1],state[4]);
    state2[3]=q(state[4],state[3]);
    state2[2]=q(state[3],state[2]);
    state2[5]=state[5];
    return state2;
}

function x(staten){ //Apply a x move
    var state2=[];
    state2[0]=m(staten[0]);
    state2[1]=staten[2];
    state2[2]=staten[3];
    state2[3]=staten[4];
    state2[4]=staten[1];
    state2[5]=m(m(m(staten[5])));
    return state2;
}

function y(state){ //Apply a y move
    var state2=[];
    state2[0]=state[4];
    state2[1]=m(state[1]);
    state2[2]=state[0];
    state2[3]=m(m(m(state[3])));
    state2[4]=state[5];
    state2[5]=state[2];
    return state2;
}

function s(algo){ //Solve a cube, representing every move with x, y and R
    algo=algo.replace(/F2/,"F F");
    algo=algo.replace(/R2/,"R R");
    algo=algo.replace(/U2/,"U U");
    algo=algo.replace(/D2/,"D D");
    algo=algo.replace(/B2/,"B B");
    algo=algo.replace(/L2/,"L L");

    algo=algo.replace(/F'/,"F F F");
    algo=algo.replace(/R'/,"R R R");
    algo=algo.replace(/U'/,"U U U");
    algo=algo.replace(/D'/,"D D D");
    algo=algo.replace(/B'/,"B B B");
    algo=algo.replace(/L'/,"L L L");

    algo=algo.replace(/F/,"y y y R y");
    algo=algo.replace(/L/,"y y R y y");
    algo=algo.replace(/U/,"x y R y y y x x x");
    algo=algo.replace(/B/,"y R y y y");
    algo=algo.replace(/D/,"x y y y R y x x x");

    algo=algo.split(" ");

    var cstate=[["R","R","R","R","R","R","R","R","R"],["W","W","W","W","W","W","W","W","W"],["G","G","G","G","G","G","G","G","G"],["Y","Y","Y","Y","Y","Y","Y","Y","Y"],["B","B","B","B","B","B","B","B","B"],["O","O","O","O","O","O","O","O","O"]];

    for(var i=0;i<algo.length;++i){
        if(algo[i]=="x"){
            cstate=x(cstate);
        }else if(algo[i]=="y"){
            cstate=y(cstate);
        }else if(algo[i]=="R"){
            cstate=r(cstate);
        }
    }

    return p(cstate);
}

function p(cstate){ //Print
    var out="";
    var leftspace="\n   ";
    for(var i=0;i<3;++i){
        out+=leftspace+cstate[1][3*i+0]+cstate[1][3*i+1]+cstate[1][3*i+2]
    }
    for(var i=0;i<3;++i){
        out+="\n"+cstate[5][3*i+0]+cstate[5][3*i+1]+cstate[5][3*i+2]+cstate[2][3*i+0]+cstate[2][3*i+1]+cstate[2][3*i+2]+cstate[0][3*i+0]+cstate[0][3*i+1]+cstate[0][3*i+2]+cstate[4][3*i+0]+cstate[4][3*i+1]+cstate[4][3*i+2]
    }
    for(var i=0;i<3;++i){
        out+=leftspace+cstate[3][3*i+0]+cstate[3][3*i+1]+cstate[3][3*i+2]
    }
    return out;
}

นี่เป็นความท้าทายที่ยากมาก

คำอธิบาย

s("R U' F")ใช้โทรตัวอย่าง

โปรแกรมสามารถดำเนินการย้าย x, y และ R เท่านั้น

U'เท่ากับU U Uดังนั้นแทนที่สิ่งนั้น

Fเท่ากับy y y R yดังนั้นแทนที่สิ่งนั้น

R U' F'จึงเท่ากับR U U U y y y R yซึ่งโปรแกรมสามารถทำงานได้

cstate ถูกกำหนดด้วยคิวบ์ที่ถูกแก้ไข คิวบ์จะถูกแทนด้วยอาร์เรย์ที่มี 6 อาร์เรย์ที่มีสติกเกอร์ 9 ตัว อาร์เรย์แรกใช้สำหรับ R, ที่สองสำหรับ U, ที่สามสำหรับ F, D, B, อาร์เรย์สุดท้ายสำหรับ L เมื่อจำเป็นต้องดำเนินการ y โปรแกรมจะสลับสี่อาร์เรย์ด้านหน้า, ซ้าย, หลังและขวา สำหรับ x มันสลับหน้าลงหลังและข้างบน การหมุนทุกครั้งจะหมุนใบหน้าอื่น ๆ ที่ไม่ได้สลับ การเคลื่อนไหว AR หมุนหน้าขวาและสลับส่วนขวาของด้านหน้าขึ้นหลังลงใบหน้า

สิ่งนี้สามารถแก้ไขได้เพื่อให้สามารถแก้ปัญหาการเคลื่อนไหวทุกประเภทได้โดยการกำหนดด้วย x, y และ R


ฉันกำลังพยายามขโมยแนวคิดของคุณเพียง 3 การเคลื่อนไหวเพื่อทำให้ตัวฉันเองสั้นลง) ความคิดที่ดี
Aaron

ดังนั้นR U' F2ได้รับการแปลงR U' F Fแรกแล้วR U U U F Fแล้วR x y R y y y x x x x y R y y y x x x x y R y y y x x x y y y R y y y y R yซึ่งมันก็ดำเนินการ? แปลก .. แต่ดั้งเดิมมาก ๆ +1 :) คุณคิดอย่างไรกับแนวคิดนี้
Kevin Cruijssen

2
รหัสของฉันก็ถูกแปลงU'ไปU U Uเช่นกัน แต่xes และys ก็ดีจริงๆ ฉันต้องการขโมยสิ่งนี้ด้วย: p
betseg

@KevinCruijssen การหมุนนั้นง่ายกว่าการเขียนโปรแกรมที่มีผลต่อเลเยอร์เดียวเท่านั้น ฉันลองใช้แนวคิดนี้เป็นครั้งแรกด้วยโปรแกรมสำหรับการจำลองคิวบ์ NxN และตอนนี้ใช้เวอร์ชันที่ง่ายขึ้นที่นี่ มันเป็นครั้งแรกเอาใด ๆ'และ2แล้วแทนที่ทั้งหมดย้าย
Paul Schmitz

ทำได้ดี แต่ก็ยังเล่นกอล์ฟได้ ฉันพยายามที่จะพอร์ตไปยัง ES6
edc65

11

C, 1715 1709 1686 1336 1328 ไบต์

บันทึก 25 ไบต์ด้วย @KevinCruijssen!

ยังไม่มีคำตอบดังนั้นฉันตัดสินใจที่จะวางวิธีการแก้ปัญหาของตัวเอง

#define m(a,b,c,d)t[c][d]=r[a][b]; 
#define n(a)m(a,0,a,2)m(a,1,a,5)m(a,2,a,8)m(a,3,a,1)m(a,5,a,7)m(a,6,a,0)m(a,7,a,3)m(a,8,a,6)
#define y memcpy
typedef char R[6][9];R t;F(R r){y(t,r,54);n(0)m(4,6,1,0)m(4,7,1,3)m(4,8,1,6)m(1,0,5,0)m(1,3,5,1)m(1,6,5,2)m(5,0,3,2)m(5,1,3,5)m(5,2,3,8)m(3,2,4,6)m(3,5,4,7)m(3,8,4,8)y(r,t,54);}B(R r){y(t,r,54);n(2)m(1,2,4,0)m(1,5,4,1)m(1,8,4,2)m(3,0,5,6)m(3,3,5,7)m(3,6,5,8)m(4,0,3,6)m(4,1,3,3)m(4,2,3,0)m(5,6,1,8)m(5,7,1,5)m(5,8,1,2)y(r,t,54);}L(R r){y(t,r,54);n(3)m(0,0,5,0)m(0,3,5,3)m(0,6,5,6)m(2,2,4,6)m(2,5,4,3)m(2,8,4,0)m(4,0,0,0)m(4,3,0,3)m(4,6,0,6)m(5,0,2,8)m(5,3,2,5)m(5,6,2,2)y(r,t,54);}E(R r){y(t,r,54);n(1)m(0,2,4,2)m(0,5,4,5)m(0,8,4,8)m(5,2,0,2)m(5,5,0,5)m(5,8,0,8)m(4,2,2,6)m(4,5,2,3)m(4,8,2,0)m(2,0,5,8)m(2,3,5,5)m(2,6,5,2)y(r,t,54);}U(R r){y(t,r,54);n(4)m(0,0,3,0)m(0,1,3,1)m(0,2,3,2)m(1,0,0,0)m(1,1,0,1)m(1,2,0,2)m(2,0,1,0)m(2,1,1,1)m(2,2,1,2)m(3,0,2,0)m(3,1,2,1)m(3,2,2,2)y(r,t,54);}D(R r){y(t,r,54);n(5)m(0,6,1,6)m(0,7,1,7)m(0,8,1,8)m(1,6,2,6)m(1,7,2,7)m(1,8,2,8)m(2,6,3,6)m(2,7,3,7)m(2,8,3,8)m(3,6,0,6)m(3,7,0,7)m(3,8,0,8)y(r,t,54);}a,b,c,d,e,o,p,l;f(char*z,R s){char c[6]="RGOBYW";for(;b<7;b++)for(a=0;a<10;)s[b][a++]=c[b];for(l=strlen(z);l-->0;){d=*z++;if(d-32){e=*z++;if(*z++-32)*z++;o=e-50?e-39?1:3:2;for(p=0;p++<o;)d-70?d-66?d-76?d-82?d-85?D(s):U(s):E(s):L(s):B(s):F(s);}}}

ลองออนไลน์!

Ungolfed เวอร์ชั่นเก่า:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

typedef char Tile;
typedef Tile Face[10];
typedef Face Rubik[7];

void main_loop(Rubik);
void rubik_init(Rubik);
void rubik_print(Rubik);
void rotate(Rubik, char, char);
void print_tile(Rubik, int, int);

void F(Rubik);
void B(Rubik);
void L(Rubik);
void R(Rubik);
void U(Rubik);
void D(Rubik);

#define move(a, b, c, d) \
      temp[c][d] = rubik[a][b]

#define move_f(a) \
    move(a, 1, a, 3); \
    move(a, 2, a, 6); \
    move(a, 3, a, 9); \
    move(a, 4, a, 2); \
    move(a, 6, a, 8); \
    move(a, 7, a, 1); \
    move(a, 8, a, 4); \
    move(a, 9, a, 7)

void F(Rubik rubik) {
    Rubik temp;
    memcpy(temp, rubik, sizeof(Rubik));
    move_f(1);
    move(5, 7, 2, 1);
    move(5, 8, 2, 4);
    move(5, 9, 2, 7);
    move(2, 1, 6, 1);
    move(2, 4, 6, 2);
    move(2, 7, 6, 3);
    move(6, 1, 4, 3);
    move(6, 2, 4, 6);
    move(6, 3, 4, 9);
    move(4, 3, 5, 7);
    move(4, 6, 5, 8);
    move(4, 9, 5, 9);
    memcpy(rubik, temp, sizeof(Rubik));
}

void B(Rubik rubik) {
    Rubik temp;
    memcpy(temp, rubik, sizeof(Rubik));
    move_f(3);
    move(2, 3, 5, 1);
    move(2, 6, 5, 2);
    move(2, 9, 5, 3);
    move(4, 1, 6, 7);
    move(4, 4, 6, 8);
    move(4, 7, 6, 9);
    move(5, 1, 4, 7);
    move(5, 2, 4, 4);
    move(5, 3, 4, 1);
    move(6, 7, 2, 9);
    move(6, 8, 2, 6);
    move(6, 9, 2, 3);
    memcpy(rubik, temp, sizeof(Rubik));
}

void L(Rubik rubik) {
    Rubik temp;
    memcpy(temp, rubik, sizeof(Rubik));
    move_f(4);
    move(1, 1, 6, 1);
    move(1, 4, 6, 4);
    move(1, 7, 6, 7);
    move(3, 3, 5, 7);
    move(3, 6, 5, 4);
    move(3, 9, 5, 1);
    move(5, 1, 1, 1);
    move(5, 4, 1, 4);
    move(5, 7, 1, 7);
    move(6, 1, 3, 9);
    move(6, 4, 3, 6);
    move(6, 7, 3, 3);
    memcpy(rubik, temp, sizeof(Rubik));
}

void R(Rubik rubik) {
    Rubik temp;
    memcpy(temp, rubik, sizeof(Rubik));
    move_f(2);
    move(1, 3, 5, 3);
    move(1, 6, 5, 6);
    move(1, 9, 5, 9);
    move(6, 3, 1, 3);
    move(6, 6, 1, 6);
    move(6, 9, 1, 9);
    move(5, 3, 3, 7);
    move(5, 6, 3, 4);
    move(5, 9, 3, 1);
    move(3, 1, 6, 9);
    move(3, 4, 6, 6);
    move(3, 7, 6, 3);
    memcpy(rubik, temp, sizeof(Rubik));
}

void U(Rubik rubik) {
    Rubik temp;
    memcpy(temp, rubik, sizeof(Rubik));
    move_f(5);
    move(1, 1, 4, 1);
    move(1, 2, 4, 2);
    move(1, 3, 4, 3);
    move(2, 1, 1, 1);
    move(2, 2, 1, 2);
    move(2, 3, 1, 3);
    move(3, 1, 2, 1);
    move(3, 2, 2, 2);
    move(3, 3, 2, 3);
    move(4, 1, 3, 1);
    move(4, 2, 3, 2);
    move(4, 3, 3, 3);
    memcpy(rubik, temp, sizeof(Rubik));
}

void D(Rubik rubik) {
    Rubik temp;
    memcpy(temp, rubik, sizeof(Rubik));
    move_f(6);
    move(1, 7, 2, 7);
    move(1, 8, 2, 8);
    move(1, 9, 2, 9);
    move(2, 7, 3, 7);
    move(2, 8, 3, 8);
    move(2, 9, 3, 9);
    move(3, 7, 4, 7);
    move(3, 8, 4, 8);
    move(3, 9, 4, 9);
    move(4, 7, 1, 7);
    move(4, 8, 1, 8);
    move(4, 9, 1, 9);
    memcpy(rubik, temp, sizeof(Rubik));
}

int main(int argc, char *argv[]) {
    Rubik rubik;
    rubik_init(rubik);
    main_loop(rubik);
    return 0;
}

void main_loop(Rubik rubik) {
    char a, b;
    for (;;) {
        a=toupper(getchar());
        if (a == 'Q') break;
        if (a != 10) {
            b=toupper(getchar());
            if (b != 10) getchar();
            rotate(rubik, a, b);
        }
        rubik_print(rubik);
    }
}

void rubik_init(Rubik rubik) {
    int i,n;
    char c[7] = " RGOBYW";

    for (n=1; n<=7; n++)
        for (i=1; i<=10; i++)
            rubik[n][i] = c[n];
}

void rotate(Rubik rubik, char a, char b){
    int i = b == '2' ? 2 : b == '\'' || b == toupper('i') ? 3 : 1;
    int j;
    for (j=0; j<i; j++)
        if (a == 'F') F(rubik);
        else if (a == 'B') B(rubik);
        else if (a == 'L') L(rubik);
        else if (a == 'R') R(rubik);
        else if (a == 'U') U(rubik);
        else if (a == 'D') D(rubik);
        else;
}

void rubik_print(Rubik rubik) {
    int i,j,k;

    for (i=1; i<=9; i++)
        if (i%3==0) {
            print_tile(rubik,5,i);
            printf("\n");
        }
        else if (i%3==1) {
            printf("    ");
            print_tile(rubik,5,i);
        }
        else
            print_tile(rubik,5,i);

    printf("\n");

    for (k=1; k<=3; k++) {
        for (i=3; i<=6; i++) {
            for (j=k*3-2; j<=k*3; j++)
                print_tile(rubik, i%4+1, j);
            printf(" ");
        }
        printf("\n");
    }

    printf("\n");

    for (i=1; i<=9; i++)
        if (i%3==0) {
            print_tile(rubik, 6, i);
            printf("\n");
        }
        else if (i%3==1) {
            printf("    ");
            print_tile(rubik, 6, i);
        }
        else
            print_tile(rubik, 6, i);

}

void print_tile(Rubik rubik, int a, int b) {
    switch (rubik[a][b]) {
      case 'R':
        printf("R");
        break;
      case 'O':
        printf("O");
        break;
      case 'B':
        printf("B");
        break;
      case 'G':
        printf("G");
        break;
      case 'Y':
        printf("Y");
        break;
      case 'W':
        printf("W");
        break;
      default:
        exit(1);
    }
}

4
ฉันไม่ใช่ C-programmer ดังนั้นแก้ไขให้ถูกต้องถ้าฉันผิด แต่ฉันเชื่อว่าคุณสามารถเล่นกอล์ฟวงลูปของคุณ: for(b=1;b<8;b++)for(a=1;a<11;a++)r[b][a]=c[b];ถึงfor(b=1;b<8;)for(a=1;a<11;)r[b][a++]=c[b++];และfor(i=1;i<=9;i++)ไปfor(i=0;++i<=9;)และอื่น ๆ สำหรับลูปเช่นกัน นอกจากนี้else ifสามารถเปลี่ยนเป็นเพียงifเมื่อคุณตรวจสอบif(d==66)B(r);if(d==76)L(r);...และนอกจากiจะเป็นเชิงลบคุณสามารถเปลี่ยนif(i%3==0)เป็นif(i%3<1)สองครั้ง และฉันแน่ใจว่ามันสามารถตีกอล์ฟได้มากกว่านี้ ยินดีที่ได้เห็นคำตอบสำหรับความท้าทายของคุณเอง :)
Kevin Cruijssen

ฉันพยายามตีลูป แต่มันใช้งานไม่ได้ดังนั้นฉันจึงตัดสินใจไม่แตะต้องพวกมัน ฉันอยู่ข้างนอกและไม่สามารถลองได้ในตอนนี้ แต่คุณพูดถูกifและiฉันจะแก้ไขเมื่อฉันกลับบ้าน ขอบคุณ!
betseg

@KevinCruijssen ลบelseโปรแกรมbork , กอล์ฟลูป bork โปรแกรมสิ่งที่มีiผลงาน ขอบคุณอยู่ดี
เดิมพัน

อืมทำไมการelse ifเปลี่ยนแปลงจึงifล้มเหลว : S ในสิ่งelse ifที่คุณเปรียบเทียบd==##กันฉันสับสนว่าทำไมมันถึงไม่เป็นเช่นนั้น อีกครั้งฉันไม่ได้เขียนโปรแกรม C ดังนั้นบางทีฉันอาจจะพลาดอะไรบางอย่างที่ C ทำไม่ได้ แต่ก็ยัง .. โอเคดีใจที่ฉันสามารถช่วย modulo <1แทนได้==0
Kevin Cruijssen


9

Python 3,  610 563 533  526 ไบต์

-7 ไบต์ขอบคุณเพื่อนร่วมงานของฉันrhsmits ( d,*cรูปแบบที่ดีจริงๆ& การกำจัดวงเล็บที่ซ้ำซ้อน)

นี่เป็นโปรแกรมเต็ม

import re
d,*c=[f*9for f in' YBRGOW']
r=lambda f:[f[int(v)]for v in'630741852']
U=lambda c:[r(c[0])]+[c[j%4+1][:3]+c[j][3:]for j in(1,2,3,4)]+[c[5]]
y=lambda c:[r(c[0])]+c[2:5]+[c[1],r(r(r(c[5])))]
z=lambda c:[c[2],r(r(r(c[1]))),c[5],r(c[3]),c[0][::-1],c[4][::-1]]
exec("c="+"(c);c=".join("".join("zzzUz U zzUzz yyyzUzzzy zUzzz yzUzzzyyy".split()[ord(t)%11%7]*(ord(n or'a')%6)for t,n in re.findall("([B-U])(['2i]?)",input())))+"(c)")
k=' '.join
for q in[d,c[0]],c[1:5],[d,c[5]]:
 for w in 0,3,6:print(k(k(f[w:w+3])for f in q))

Superflipและการทดสอบทั้งหมดมีให้ที่ideoneหรือทดลองออนไลน์!

โปรแกรม:

  • สร้างYBRGOWสติกเกอร์หกหน้า
  • สร้างฟังก์ชั่นrซึ่งเพียงหมุนสติกเกอร์บนใบหน้าที่ตามเข็มนาฬิกาไตรมาสเลี้ยว
  • สร้างฟังก์ชั่นUซึ่งหมุนUใบหน้าตามเข็มนาฬิกาหนึ่งในสี่ของรอบโดยใช้rและหมุนสติกเกอร์บนวงบนของLFRBตามเข็มนาฬิกาในรอบไตรมาส
  • สร้างฟังก์ชั่นyซึ่งดำเนินการrบนUและDใบหน้าและชิ้นLFRB
    - นี้ดำเนินการหมุนของทั้งก้อนในyแกน (ซึ่งไหลผ่านUและD)
    - การหมุนเป็นตามเข็มนาฬิกาถ้ามองจากด้านบน
  • สร้างฟังก์ชั่นzซึ่งดำเนินการหมุนของลูกบาศก์ทั้งหมดในzแกนตามเข็มนาฬิกาหนึ่งรอบหันมาดูR(แกนวิ่งผ่านRและL) - เวลานี้เพราะวิธีที่ใบหน้าจะมุ่งเน้นในสุทธิของเรา (เช่นเดียวกับที่กำหนดใน OP) เรา ต้องพลิกBและUหันหน้าไปทาง (พวกเขาสลับจากส่วนแนวนอนเป็นแนวตั้งของตาข่ายและในทางกลับกัน)
  • ดำเนินการ regex กับอินพุต,, input()(การเคลื่อนไหวที่จะดำเนินการ) จับคู่อักขระจากBUDLRF(จริง ๆB-U) ตามด้วยอักขระ'i2
  • ทำการแมปจาก'i2จำนวนถึงการหมุนตามเข็มนาฬิกา (ลำดับของ mod เหล่านี้6ทำงานด้วยดัมมี่ที่aจะให้ผล1เมื่อไม่มีอยู่)
  • ทำการค้นหาเพื่อแมปคำแนะนำการหมุนตามเข็มนาฬิกาแต่ละอันเหล่านี้ไปยังการตั้งค่าการโทรyและzหนึ่งในสี่ของU(ซึ่งจะเป็นใบหน้าที่ได้รับคำสั่ง) จากนั้นการโทรเพื่อกลับลำดับการตั้งค่าที่ดำเนินการ การจัดลำดับของโมดูโลตัวละครใบหน้าจาก11นั้นโดยการ7ทำแผนที่B:0 U:1 D:2 L:3 F:4 R:5ช่วยให้การจัดทำดัชนีอย่างง่ายในสตริงของลำดับชื่อฟังก์ชั่นแบ่งตามช่องว่าง
  • ดำเนินการสตริงเพื่อดำเนินการซ้อมรบจริง
  • สร้างหน้าจำลองdเพื่อทำให้งานพิมพ์สั้นลง
  • พิมพ์ผลลัพธ์โดยการก้าวผ่านแถวในตาข่ายและใบหน้าในแถว (รวมถึงหน้าจำลองทางด้านซ้ายของแต่ละUและD

นี่คือsuperflip :

D:\Python Scripts>python rubiksAscii.py
U R2 F B R B2 R U2 L B2 R U' D' R2 F R' L B2 U2 F2
      Y O Y
      B Y G
      Y R Y
B Y B R Y R G Y G O Y O
O B R B R G R G O G O B
B W B R W R G W G O W O
      W R W
      B W G
      W O W

8

หลาม 760 750 649 ไบต์

ขโมยความคิดอย่างไร้ยางอายโดยใช้การหมุนเพียง 3 ครั้งจาก @Paul Schmitz: D

เวอร์ชั่นใหม่:

from numpy import*
c=kron([[32,89,32,32],[66,82,71,79],[32,87,32,32]],ones([3,3])).astype(int)
def x():t=copy(c);c[:3,3:6],c[3:6,3:6],c[6:,3:6],c[3:6,9:],c[3:6,:3],c[3:6,6:9]=t[3:6,3:6],t[6:,3:6],rot90(t[3:6,9:],2),rot90(t[:3,3:6],2),rot90(t[3:6,:3]),rot90(t[3:6,6:9],3)
def y():c[3:6],c[:3,3:6],c[6:,3:6]=roll(c[3:6],3,1),rot90(c[:3,3:6]),rot90(c[6:,3:6],3)
def F():c[2:7,2:7]=rot90(c[2:7,2:7],3)
s=raw_input()
for p in"':i,Fi:FFF,F2:FF,Bi:BBB,B2:BB,Ri:RRR,R2:RR,Li:LLL,L2:LL,Ui:UUU,U2:UU,Di:DDD,D2:DD,B:xxFxx,R:yyyFy,L:yFyyy,U:xxxFx,D:xFxxx".split(','):s=s.replace(*p.split(':'))
for S in s:eval(S+'()')
for r in c:print(''.join(chr(x)for x in r))

ฉันส่วนใหญ่เพิ่งทำรายการ numpy จำนวนมากและใช้ฟังก์ชันหมุนและม้วนในตัว อินพุตถูกจัดการโดยเรียกใช้ฟังก์ชันโดยตรงด้วยeval()

from numpy import*
l=[0];c=kron([[32,89,32,32],[66,82,71,79],[32,87,32,32]],ones([3,3])).astype(int)
def i():l[0]();l[0]()
def d():l[0]()
def U():c[:3,3:6]=rot90(c[:3,3:6],3);c[3]=roll(c[3],9);l[0]=U
def D():c[6:,3:6]=rot90(c[6:,3:6],3);c[5]=roll(c[5],3);l[0]=D
def F():c[2:7,2:7]=rot90(c[2:7,2:7],3);l[0]=F
def B():c[3:6,9:]=rot90(c[3:6,9:],3);t=copy(c);c[:,:9],c[1:-1,1:8]=rot90(t[:,:9]),t[1:-1,1:8];l[0]=B
def R():c[3:6,6:9]=rot90(c[3:6,6:9],3);t=copy(c);c[:6,5],c[3:6,9],c[6:,5]=t[3:,5],t[2::-1,5],t[5:2:-1,9];l[0]=R
def L():c[3:6,:3]=rot90(c[3:6,:3],3);t=copy(c);c[3:,3],c[3:6,-1],c[:3,3]=t[:6,3],t[:5:-1,3],t[5:2:-1,-1];l[0]=L
for s in raw_input().replace("'",'i').replace('2','d').replace(' ',''):eval(s+'()')
for r in c:print(''.join(chr(x)for x in r))

ungolfed ..

import numpy as np
last = [0] #store last move to repeat for inverse or double
           #list is shorter syntax than global var

cube = np.array([
[' ',' ',' ','Y','Y','Y',' ',' ',' ',' ',' ',' '],
[' ',' ',' ','Y','Y','Y',' ',' ',' ',' ',' ',' '],
[' ',' ',' ','Y','Y','Y',' ',' ',' ',' ',' ',' '],
['B','B','B','R','R','R','G','G','G','O','O','O'],
['B','B','B','R','R','R','G','G','G','O','O','O'],
['B','B','B','R','R','R','G','G','G','O','O','O'],
[' ',' ',' ','W','W','W',' ',' ',' ',' ',' ',' '],
[' ',' ',' ','W','W','W',' ',' ',' ',' ',' ',' '],
[' ',' ',' ','W','W','W',' ',' ',' ',' ',' ',' ']
]) #ascii ascii codes in golfed version

def i(): #triple move (inverse)
    last[0]()
    last[0]()

def d(): #double move
    last[0]()

def U(): #clockwise upface (yellow)
    cube[:3,3:6] = np.rot90(cube[:3,3:6],3)
    cube[3] = np.roll(cube[3],9)
    last[0] = U

def D(): #clockwise downface (white)
    cube[6:,3:6] = np.rot90(cube[6:,3:6],3)
    cube[5] = np.roll(cube[5],3)
    last[0] = D

def F(): #clockwise frontface (red)
    cube[2:7,2:7] = np.rot90(cube[2:7,2:7],3)
    last[0] = F

def B(): #clockwise backface (orange)
    cube[3:6,9:] = np.rot90(cube[3:6,9:],3)
    tempCube = np.copy(cube)
    cube[:,:9],cube[1:-1,1:8] = np.rot90(tempCube[:,:9]),tempCube[1:-1,1:8]
    last[0] = B

def R(): #clockwise rightface (green)
    cube[3:6,6:9] = np.rot90(cube[3:6,6:9],3)
    tempCube = np.copy(cube)
    cube[:6,5],cube[3:6,9],cube[6:,5] = tempCube[3:,5],tempCube[2::-1,5],tempCube[5:2:-1,9]
    last[0] = R

def L(): #clockwise leftface (blue)
    cube[3:6,:3] = np.rot90(cube[3:6,:3],3)
    tempCube = np.copy(cube)
    cube[3:,3],cube[3:6,-1],cube[:3,3] = tempCube[:6,3],tempCube[:5:-1,3],tempCube[5:2:-1,-1]
    last[0] = L


for character in raw_input('type a move sequence: ').replace("'",'i').replace('2','d').replace(' ',''):
    eval(character+'()')

print("-"*12)

for row in cube:
    print(''.join(character for character in row)) #uses ascii codes in golfed version

ทดสอบอินพุต:

>>> runfile('C:~/rubiks cube.py', wdir='C:~/python/golf')
U2 L' D
   OYY      
   RYY      
   RYY      
GBBWOOBBBRRY
GBBWRRGGGOOY
OOYGBBWRRGGG
   ROO      
   WWW      
   WWW 

ความคิดเห็นหรือข้อเสนอแนะได้รับการชื่นชมอย่างมาก :)


2
of using only 3 rotationsไม่ถูกต้อง. โปรแกรมแปลงลำดับใด ๆ เป็นลำดับที่มีการเคลื่อนไหวมากขึ้น หากคุณป้อนF F F Fจะใช้มากกว่า 3 y y y R y y y y R y y y y R y y y y R yผลัดเป็นมันจะแปลงไป มันใช้การหมุนสามประเภท
Paul Schmitz

@PaulSchmitz สามประเภทคือสิ่งที่ฉันหมายถึง .... การแปลงมีการระบุไว้ในสตริงในบรรทัดที่เจ็ด
Aaron

7

C, 839 ไบต์

#include <stdio.h>
#define b(c) c,c+1,c+2,c+15,c+28,c+27,c+26,c+13
char a[]="   YYY      \n   YYY      \n   YYY      \nBBBRRRGGGOOO\nBBBRRRGGGOOO\nBBBRRRGGGOOO\n   WWW      \n   WWW      \n   WWW      \n",k;int d[][8]={b(3),b(39),b(42),b(45),b(48),b(81)},e[][12]={50,49,48,47,46,45,44,43,42,41,40,39,3,16,29,42,55,68,81,94,107,76,63,50,29,30,31,45,58,71,83,82,81,67,54,41,109,96,83,70,57,44,31,18,5,48,61,74,39,52,65,107,108,109,73,60,47,5,4,3,65,66,67,68,69,70,71,72,73,74,75,76},i,*j,r,p,q,s;f(int*g,int h){i=h<0?-1:1;for(j=g;j!=g+h;j+=i){k=a[j[3*h]];for(r=3;r--;)a[j[r*h+h]]=a[j[r*h]];a[*j]=k;}}l(int g,int m){f(d[g+m]-m,m?-2:2);f(e[g+m]-m,m?-3:3);}void n(char*o){while(*o){*o-'U'||(p=0);*o-'L'||(p=1);*o-'F'||(p=2);*o-'R'||(p=3);*o-'B'||(p=4);*o-'D'||(p=5);s=*++o=='\''||*o=='i';q=*o=='2';(s||q)&&o++;l(p,s);q&&l(p,0);}printf("%s",a);}

เนื่องจากนี่ไม่ใช่โปรแกรมเต็มรูปแบบ (ฟังก์ชั่นที่มีอินพุตจากอาร์กิวเมนต์สตริงและเอาต์พุตไปยังคอนโซล) คุณต้องเรียกมันดังนี้:

int main() {
//  n("U2D2R2L2F2B2");    //checker cube
    n("UDiRL'FBiUD'");    //spotted cube
}

ใช้การโทรครั้งละครั้งเดียวเมื่อฟังก์ชันใช้และแก้ไขตัวแปรโกลบอล

Ungolfed:

#include <stdio.h>

char cube[] = "   YYY      \n"
              "   YYY      \n"
              "   YYY      \n"
              "BBBRRRGGGOOO\n"
              "BBBRRRGGGOOO\n"
              "BBBRRRGGGOOO\n"
              "   WWW      \n"
              "   WWW      \n"
              "   WWW      \n";

#define faceMove(offset) offset,offset+1,offset+2,offset+15,offset+28,offset+27,offset+26,offset+13
int faceMoves[6][8] = {
    faceMove(3),    //Up
    faceMove(39),   //Left
    faceMove(42),   //Front
    faceMove(45),   //Right
    faceMove(48),   //Back
    faceMove(81)    //Down
}, lineMoves[6][12] = {
    50,49,48,47,46,45,44,43,42,41,40,39,    //Up
    3,16,29,42,55,68,81,94,107,76,63,50,    //Left
    29,30,31,45,58,71,83,82,81,67,54,41,    //Front
    109,96,83,70,57,44,31,18,5,48,61,74,    //Right
    39,52,65,107,108,109,73,60,47,5,4,3,    //Back
    65,66,67,68,69,70,71,72,73,74,75,76 //Down
};

int rotate(int*move,int rotation){
    int sign=rotation<0?-1:1;
    for(int*submove=move;submove!=move+rotation;submove+=sign){
        char takeout=cube[submove[3*rotation]];
        for(int j=3;j--;)cube[submove[j*rotation+rotation]]=cube[submove[j*rotation]];
        cube[*submove]=takeout;
    }
}

int move(int move,int inverted){
    rotate(faceMoves[move+inverted]-inverted,inverted?-2:2);
    rotate(lineMoves[move+inverted]-inverted,inverted?-3:3);
}

void performMoves(char*instructions){
    while(*instructions){
        int moveIndex;
        *instructions-'U'||(moveIndex=0);
        *instructions-'L'||(moveIndex=1);
        *instructions-'F'||(moveIndex=2);
        *instructions-'R'||(moveIndex=3);
        *instructions-'B'||(moveIndex=4);
        *instructions-'D'||(moveIndex=5);
        int inverted=*++instructions=='\''||*instructions=='i', twice=*instructions=='2';
        (inverted||twice)&&instructions++;
        move(moveIndex,inverted);
        twice&&move(moveIndex,0);
    }
    printf("%s",cube);
}

int main() {
//  performMoves("U2D2R2L2F2B2");    //checker cube
    performMoves("UDiRL'FBiUD'");    //spotted cube
}

อย่างที่คุณเห็นความคิดหลักคือการใช้วิธีการขับเคลื่อนข้อมูลอย่างเต็มที่: การหมุนที่แตกต่างกันจะแสดงเป็นรายการของดัชนีที่จะต้องมีการเปลี่ยนแปลง รหัสการเปลี่ยนแปลงจึงอาจสั้นและเป็นรหัสทั่วไป


2
ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

คุณสามารถทำสิ่งต่อไปนี้เพื่อบันทึกไบต์เพิ่มเติม: f(h,g)int*g;{-2, l(g,m){-8, n(char*o){-5, printf("%s",a)ถึงputs(a)-7, นอกจากนี้คุณสามารถแทนที่ค่าคงที่อักขระ char ด้วยการแทนทศนิยม ASCII -1 แต่ละอัน
Khaled.K


5

ตามอำเภอใจ 2 ไบต์

¶■

ลองออนไลน์!

คำอธิบาย:

¶   read a line from stdin, evaluate
 ■  print the cube to stdout

หากอนุญาตการส่งออกภายนอกสิ่งนี้จะเป็นทางเลือก 1 ไบต์:

ลองออนไลน์!

ทิ้งลูกบาศก์หน่วยความจำของมันโดยอัตโนมัติตามคิวบ์STDERRเมื่อโปรแกรมสิ้นสุดลง อย่างไรก็ตามมันยังพิมพ์แผ่นจดบันทึกไว้ล่วงหน้า


2
ฉันไม่รู้ว่าจะปรบมือให้หรือโห่ร้องคุณ +1
Jo King

@ โจกิ้งทั้งคู่ เช่นเดียวกับเมื่อความท้าทายของคิวบ์ลูกบาศก์อื่น ๆ 1 2 3
MD XF

4

JavaScript (ES6), 820

การย้ายคำตอบ buggy โดย @Paul Schmitz มันยังไม่ได้เล่นกอล์ฟอย่างสมบูรณ์ แต่มีมูลค่าเพิ่มที่ใช้งานได้

ปัญหาหลักในคำตอบเดิมคือฟังก์ชั่นเดียว Q ไม่เพียงพอสำหรับการเคลื่อนไหวทั้งหมดที่เกี่ยวข้องในการหมุน ฉันต้องเพิ่ม 2 ฟังก์ชั่นอื่น ๆ O และ N พวกเขาทั้งหมดถูกเรียกในฟังก์ชันการหมุนขวา R

(a,M=a=>[a[6],a[3],a[0],a[7],a[4],a[1],a[8],a[5],a[2]],Q=(a,b)=>[b[0],b[1],a[2],b[3],b[4],a[5],b[6],b[7],a[8]],N=(a,b)=>[b[0],b[1],a[6],b[3],b[4],a[3],b[6],b[7],a[0]],O=(a,b)=>[b[8],a[1],a[2],b[5],a[4],a[5],b[2],a[7],a[8]],R=a=>[M(a[0]),Q(a[2],a[1]),Q(a[3],a[2]),N(a[4],a[3]),O(a[4],a[1]),a[5]],X=a=>[M(a[0]),a[2],a[3],M(M(a[4])),M(M(a[1])),M(M(M(a[5])))],Y=a=>[a[4],M(a[1]),a[0],M(M(M(a[3]))),a[5],a[2]],F=c=>Array(9).fill(c[0]),r='replace',b=[F`G`,F`Y`,F`R`,F`W`,F`O`,F`B`],J=(p,l)=>p.join``[r](/.../g,l))=>(a[r](/(.)2/g,"$1$1")[r](/(.)['i]/g,"$1$1$1")[r](/F/g,"yyyRy")[r](/L/g,"yyRyy")[r](/B/g,"yRyyy")[r](/U/g,"xyRyyyxxx")[r](/D/g,"xyyyRyxxx")[r](/\w/g,c=>b=(c<'a'?R:c<'y'?X:Y)(b)),o=J(b[1],`
   $&`),J(b[5],(c,p)=>o+=`
`+c+b[2].join``.substr(p,3)+b[0].join``.substr(p,3)+b[4].join``.substr(p,3)),o+J(b[3],`
   $&`))

อ่านเพิ่มเติมอาจจะ

( 
  a, 
  // local variables as default parameters
  r='replace',
  F=c=>Array(9).fill(c[0]), // function to fill a 3x3 square
  b=[F`G`,F`Y`,F`R`,F`W`,F`O`,F`B`], // cube status
  // aux functions to perform basic moves
  M=a=>[a[6],a[3],a[0],a[7],a[4],a[1],a[8],a[5],a[2]],
  Q=(a,b)=>[b[0],b[1],a[2],b[3],b[4],a[5],b[6],b[7],a[8]],
  N=(a,b)=>[b[0],b[1],a[6],b[3],b[4],a[3],b[6],b[7],a[0]],
  O=(a,b)=>[b[8],a[1],a[2],b[5],a[4],a[5],b[2],a[7],a[8]],
  // R : right side rotation
  R=a=>[M(a[0]),Q(a[2],a[1]),Q(a[3],a[2]),N(a[4],a[3]),O(a[4],a[1]),a[5]],
  // X,Y: to put other sides in place of right side
  X=a=>[M(a[0]),a[2],a[3],M(M(a[4])),M(M(a[1])),M(M(M(a[5])))],
  Y=a=>[a[4],M(a[1]),a[0],M(M(M(a[3]))),a[5],a[2]],
  // aux function for output
  J=(p,l)=>p.join``[r](/.../g,l),
) => (
  // convert common moves to basic moves
  a[r](/(.)2/g,"$1$1")[r](/(.)['i]/g,"$1$1$1")[r](/F/g,"yyyRy")[r](/L/g,"yyRyy")[r](/B/g,"yRyyy")[r](/U/g,"xyRyyyxxx")[r](/D/g,"xyyyRyxxx")
  // then execute each
  [r](/\w/g,c=>b=c<'a'?R(b):c<'y'?X(b):Y(b)),
  // built output in o
  o=J(b[1],'\n   $&'),
  J(b[5],(c,p)=>o+='\n'+c+b[2].join``.substr(p,3)+b[0].join``.substr(p,3)+b[4].join``.substr(p,3)),
  o+J(b[3],'\n   $&') // returned output
)

S=
(a,M=a=>[a[6],a[3],a[0],a[7],a[4],a[1],a[8],a[5],a[2]],Q=(a,b)=>[b[0],b[1],a[2],b[3],b[4],a[5],b[6],b[7],a[8]],N=(a,b)=>[b[0],b[1],a[6],b[3],b[4],a[3],b[6],b[7],a[0]],O=(a,b)=>[b[8],a[1],a[2],b[5],a[4],a[5],b[2],a[7],a[8]],R=a=>[M(a[0]),Q(a[2],a[1]),Q(a[3],a[2]),N(a[4],a[3]),O(a[4],a[1]),a[5]],X=a=>[M(a[0]),a[2],a[3],M(M(a[4])),M(M(a[1])),M(M(M(a[5])))],Y=a=>[a[4],M(a[1]),a[0],M(M(M(a[3]))),a[5],a[2]],F=c=>Array(9).fill(c[0]),r='replace',b=[F`G`,F`Y`,F`R`,F`W`,F`O`,F`B`],J=(p,l)=>p.join``[r](/.../g,l))=>(a[r](/(.)2/g,"$1$1")[r](/(.)['i]/g,"$1$1$1")[r](/F/g,"yyyRy")[r](/L/g,"yyRyy")[r](/B/g,"yRyyy")[r](/U/g,"xyRyyyxxx")[r](/D/g,"xyyyRyxxx")[r](/\w/g,c=>b=(c<'a'?R:c<'y'?X:Y)(b)),o=J(b[1],`
   $&`),J(b[5],(c,p)=>o+=`
`+c+b[2].join``.substr(p,3)+b[0].join``.substr(p,3)+b[4].join``.substr(p,3)),o+J(b[3],`
   $&`))

function update() { O.textContent=S(I.value) }

update()
<input id=I value='U2 Li D' oninput='update()'><pre id=O></pre>


ฉันupdate()ไม่ได้รับการกำหนดไว้ในคอนโซลของฉันในขณะที่เรียกใช้ข้อมูล
Kritixi Lithos

@KritixiLithos คุณอาจมีข้อผิดพลาด sintax เนื่องจากไม่มีเบราว์เซอร์ที่สอดคล้องกับ ES6 ฉันทดสอบด้วย Firefox คุณใช้เบราว์เซอร์ใด
edc65

ฉันใช้ Chrome
Kritixi Lithos

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