Mô phỏng khối Rubik


39

Một khối Rubik có 6 màu: đỏ, cam, vàng, trắng, xanh dương và xanh lục. Mặt đỏ và cam, vàng và trắng, mặt xanh và xanh nằm ở hai bên đối diện.

Mạng của khối Rubik đã giải quyết trông như thế này:

 Y
BRGO
 W

Và gạch trông như thế này:

      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

Thử thách

Các phép quay đã cho, các phép quay đảo ngược hoặc phép quay kép tạo ra một khối được giải sẽ biến thành nghệ thuật ASCII hoặc như một hình ảnh (không cần phải có khoảng trắng, có thể có hoặc không tồn tại, các khoảng trắng theo dõi được cho phép.).

Đầu vào sẽ là xoay (và sửa đổi tùy chọn). Ký hiệu xoay đi như: U(p), L(eft), F(ront), R(ight), B(ack), D(own); 2(gấp đôi), 'hoặc i(nghịch đảo).

Tất cả các góc quay bình thường sẽ là 90 ° theo chiều kim đồng hồ, các góc quay ngược chiều kim đồng hồ.

Giải thích về độ đồng hồ : Hãy tưởng tượng khối lập phương khi bạn nhìn vào mặt đỏ và mặt vàng ở trên cùng. Sau đó xoay khối lập phương để mặt mà chương trình sẽ xoay sẽ đối diện với bạn. Đây là cách thức đồng hồ sẽ hoạt động. (Ngoại trừ mặt sau, bạn sẽ xoay khối theo chiều ngang trong trường hợp đó.)

Đầu vào

Đầu vào sẽ là một danh sách các động thái.

Đầu ra

Một nghệ thuật ASCII đại diện cho khối lập phương hoặc hình ảnh của mạng khối.

Ví dụ

Đầu vào : (trống)

Đầu ra :

      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 vào : U(lên)

Đầu ra :

      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 vào : U'hoặc Ui(nghịch đảo lên)

Đầu ra :

      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

Đầu vào : U2(tăng gấp đôi)

Đầu ra :

      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

Đầu vào : L'(đảo ngược sang trái)

Đầu ra :

      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

Đầu vào : R(phải)

Đầu ra :

      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

Đầu vào : U2 L' D(tăng gấp đôi, nghịch đảo trái, xuống)

Đầu ra :

      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

Quy tắc

  • Không có sơ hở cho phép.
  • Đây là , vì vậy mã ngắn nhất trong các byte giải quyết vấn đề sẽ thắng.


Chúng ta có thể chọn chọn định hướng lại khối lập phương không (ví dụ: có White U, Orange F và Green R)?
Primo

Vâng, tất nhiên, miễn là chúng riêng biệt và dễ nhận biết.
betseg

Chúng ta cần phải hỗ trợ S, E, M, x, y, z, u/ Uw, d/ Dw, r/ Rw, l/ Lw, f/ Fw, b/ Bwdi chuyển không? Hoặc chỉ mặc định: U, D, R, L, F, Bvà biến ngược chiều kim đồng của họ với dấu nháy đơn ( ')? Off-topic: Tôi luôn tự hỏi với những câu hỏi liên quan đến Rubik's Cube, bạn có phải là người sưu tầm Twisty Puzzles không?
Kevin Cruijssen

3
@KevinCruijssen Dang, đó là rất nhiều câu đố.
mbomb007

Câu trả lời:


14

Ruby, 370 339 305 byte

Chỉnh sửa mới nhất: một vài byte được lưu bằng cách sắp xếp lại các công thức vẽ đồ thị và loại bỏ các dấu ngoặc không cần thiết. Một sự tiết kiệm lớn bằng cách viết lại thế hệ của khối lập phương - tôi chưa bao giờ biết Ruby đã tích hợp sẵn cho các sản phẩm của 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}

Chức năng ẩn danh.

Chấp nhận một chuỗi các chuỗi, mỗi chuỗi đại diện cho một lượt quay mặt (một chuỗi đơn có khoảng cách giữa mỗi lần quay mặt là thêm 6 byte.)

Trả về một chuỗi hình chữ nhật 9x12.

Giải thích ngắn gọn

Điều này dựa trên một khái niệm từ câu trả lời của tôi cho câu hỏi này , đến lượt nó dựa trên một khái niệm tương tự của Jan Dvorak.

Dòng đầu tiên tạo ra một mảng 27 phần tử, đại diện cho 27 khối. Mỗi khối được thể hiện bằng một vectơ 3 chiều trong đó dấu hiệu đại diện cho vị trí hiện tại của nó và độ lớn của mỗi tọa độ thể hiện mã ascii cho màu của nhãn dán.

Ví dụ di chuyển: đối với R, đối với mỗi khối kiểm tra nếu tọa độ x> 0 và nếu xoay 90 độ bằng cách hoán đổi tọa độ y và z và hoán đổi dấu của một trong số chúng.

Lấy một mảng 9x12 của không gian và vẽ hình khối vào đó. Đối với mỗi khối và trục, chúng tôi kiểm tra xem nhãn dán có tồn tại không (tọa độ trong trục đó khác không) và tìm ra nơi cần đến. Sau đó, chúng tôi lấy tọa độ và thực hiện .abs.chrđể thay đổi số thành ký tự được yêu cầu và vẽ nó.

Ungolfed trong chương trình thử nghiệm (mỗi lần chỉnh sửa 339 byte)

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]

Đầu ra

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 byte

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}

Ung dung:

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;
}

Đây là một thử thách rất khó khăn.

Giải trình

Lấy ví dụ cuộc gọi s("R U' F").

Chương trình chỉ có thể thực hiện di chuyển x, y và R.

U'là bằng U U U, vì vậy thay thế.

Flà bằng y y y R y, vì vậy thay thế.

R U' F'do đó bằng R U U U y y y R y, mà chương trình có thể chạy.

cstate được định nghĩa với một khối được giải. Một khối được đại diện bởi một mảng chứa 6 mảng chứa 9 nhãn dán. Mảng đầu tiên là cho R, thứ hai cho U, thứ ba cho F, D, B, mảng cuối cùng dành cho L. Khi một y cần được thực thi, chương trình hoán đổi bốn mảng của mặt trước, mặt trái, mặt sau và mặt phải. Đối với một x, nó hoán đổi trước, xuống, sau và trên cùng. Mỗi vòng quay cũng xoay các mặt khác, không bị tráo đổi. AR di chuyển xoay mặt phải và hoán đổi phần bên phải của mặt trước, mặt trên, mặt sau, mặt dưới.

Điều này có thể được sửa đổi để có thể giải quyết vấn đề với tất cả các loại di chuyển, bằng cách xác định chúng bằng x, y và R.


Tôi đang làm việc để đánh cắp khái niệm của bạn chỉ có 3 động tác để rút ngắn thời gian của riêng tôi;) Ý tưởng tuyệt vời
Aaron

Vì vậy, R U' F2được chuyển đổi thành R U' F Fđầu tiên, sau đó R U U U F F, sau 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đó nó thực hiện? Lạ .. nhưng rất nguyên bản. +1 :) Làm thế nào bạn nảy ra ý tưởng này?
Kevin Cruijssen

2
Mã của tôi chuyển đổi U'thành U U Uquá, nhưng xes và ys thực sự tốt. Tôi cũng muốn đánh cắp điều này: p
betseg

@KevinCruijssen Xoay vòng dễ lập trình hơn nhiều so với di chuyển chỉ ảnh hưởng đến một lớp. Lần đầu tiên tôi đã thử khái niệm này với một chương trình mô phỏng các khối NxN, và bây giờ đã triển khai một phiên bản dễ dàng hơn ở đây. Đầu tiên, nó loại bỏ bất kỳ '2, sau đó thay thế tất cả các di chuyển.
Paul Schmitz

Làm tốt nhưng vẫn chơi được golf. Tôi đang cố gắng chuyển nó sang ES6
edc65

11

C, 1715 1709 1686 1336 1328 byte

25 byte được lưu nhờ vào @KevinCruijssen!

Không có câu trả lời cho đến nay, vì vậy tôi quyết định đưa ra giải pháp của riêng mình.

#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);}}}

Hãy thử trực tuyến!

Ungolfed phiên bản cũ:

#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
Tôi không phải là lập trình viên C, vì vậy hãy sửa lỗi cho tôi nếu tôi sai, nhưng tôi tin rằng bạn có thể chơi một số vòng lặp của bạn: for(b=1;b<8;b++)for(a=1;a<11;a++)r[b][a]=c[b];đến for(b=1;b<8;)for(a=1;a<11;)r[b][a++]=c[b++];for(i=1;i<=9;i++)đi for(i=0;++i<=9;), và một số vòng lặp khác. Ngoài ra, else ifcó thể thay đổi thành chỉ ifkhi bạn kiểm tra if(d==66)B(r);if(d==76)L(r);...Và, trừ khi icó thể âm, bạn có thể thay đổi if(i%3==0)thành if(i%3<1)hai lần. Và tôi chắc chắn rằng nó có thể được đánh gôn thêm. Rất vui khi thấy một câu trả lời về thách thức của riêng bạn, mặc dù. :)
Kevin Cruijssen

Tôi đã thử đánh gôn các vòng, nhưng nó không hoạt động, vì vậy tôi quyết định không chạm vào chúng. Tôi đang ở bên ngoài và không thể thử chúng bây giờ. Nhưng bạn nói đúng về ifs và imặc dù, tôi sẽ sửa chúng một lần tôi về nhà. Cảm ơn!
betseg

@KevinCruijssen loại bỏ elsebork chương trình, các vòng golf đánh bại chương trình, điều với icác công việc. Dù sao cũng cảm ơn bạn.
betseg

Hmm, tại sao sự else ifthay đổi để ifthất bại? : S Trong mỗi else ifbạn so sánh d==##, vì vậy tôi bối rối tại sao nó không. Một lần nữa, tôi không lập trình C, vì vậy có lẽ tôi đang thiếu một điều rõ ràng mà C không thể làm được, nhưng vẫn vậy .. À, rất vui vì tôi có thể giúp với modulo <1thay vì==0
Kevin Cruijssen


9

Python 3,  610 563 533  526 byte

-7 byte nhờ đồng nghiệp của tôi rhsmits (thật sự tốt đẹp d,*chình thức & loại bỏ các dấu ngoặc đơn thừa)

Đây là một chương trình đầy đủ.

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 và tất cả các bài kiểm tra có sẵn tại ideone hoặc Dùng thử trực tuyến!

Chương trình:

  • tạo ra sáu mặt YBRGOWcủa nhãn dán.
  • tạo ra một chức năng, rchỉ xoay dán trên khuôn mặt, chiều kim đồng hồ một phần tư lần lượt
  • tạo ra một chức năng, Uxoay Umặt theo chiều kim đồng hồ một phần tư rvòng tròn bằng cách áp dụng và xoay các nhãn dán trên dải trên cùng LFRBtheo chiều kim đồng hồ một phần tư
  • tạo ra một chức năng, yđể thực hiện việc rtrên UDkhuôn mặt và lát LFRB
    - Thực hiện điều này một vòng quay của toàn bộ khối trong ytrục (chạy qua UD)
    - vòng quay là chiều kim đồng hồ nếu nhìn từ trên cao
  • tạo ra một hàm z, thực hiện một vòng quay của toàn bộ khối theo ztrục theo chiều kim đồng hồ, một phần tư lần lượt nhìn vào R(trục chạy qua RL) - lần này bởi vì cách các mặt được định hướng trong mạng của chúng ta (giống như được đưa ra trong OP), chúng ta phải lật Bvà lật Umặt (chúng chuyển từ phần ngang sang phần dọc của lưới và ngược lại)
  • Thực hiện một biểu thức chính trên đầu vào, input()(di chuyển sẽ được thực hiện) khớp với một ký tự từ BUDLRF(thực tế B-U) có thể được theo sau bởi một ký tự'i2
  • Thực hiện ánh xạ từ 'i2đến số vòng quay theo chiều kim đồng hồ (các quy tắc của các mod 6này thực hiện công việc, với một hình nộm ađể mang lại 1khi không có mặt)
  • Thực hiện tra cứu để ánh xạ từng hướng dẫn lần lượt theo chiều kim đồng hồ này sang thiết lập các cuộc gọi đến yz, một phần tư U(giờ sẽ là mặt được hướng dẫn), và sau đó các cuộc gọi để đảo ngược trình tự thiết lập được thực hiện. Sau đó, lấy thứ tự của modulo nhân vật khuôn mặt 11bằng các 7bản đồ B:0 U:1 D:2 L:3 F:4 R:5, cho phép lập chỉ mục đơn giản thành một chuỗi các chuỗi tên hàm được phân tách bằng dấu cách.
  • thực thi chuỗi để thực hiện thao tác
  • tạo ra một khuôn mặt giả dđể rút ngắn việc in ấn
  • in kết quả bằng cách bước qua các hàng trong mạng và các mặt trong hàng (bao gồm một mặt giả ở bên trái của mỗi UD

Đây là 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

Con trăn 760 750 649 byte

không biết xấu hổ đã đánh cắp ý tưởng chỉ sử dụng 3 vòng quay từ @Paul Schmitz: D

phiên bản mới:

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))

Tôi chủ yếu chỉ thực hiện nhiều thao tác cắt danh sách gọn gàng và sử dụng các chức năng xoay và cuộn tích hợp của nó. Đầu vào được xử lý bằng cách gọi các chức năng trực tiếp vớieval()

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))

vô dụng ..

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

kiểm tra đầu vào:

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

Nhận xét hoặc đề xuất được đánh giá rất cao :)


2
of using only 3 rotationssai rồi. Chương trình chuyển đổi bất kỳ chuỗi thành một chuỗi với nhiều di chuyển. Nếu bạn nhập F F F F, nó sử dụng nhiều hơn 3 phép quay, khi nó chuyển đổi thành y y y R y y y y R y y y y R y y y y R y. Nó sử dụng ba loại quay.
Paul Schmitz

@PaulSchmitz có ba loại là ý tôi .... chuyển đổi được liệt kê trong chuỗi ở dòng thứ bảy
Aaron

7

C, 839 byte

#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);}

Vì đây không phải là một chương trình đầy đủ (chức năng với đầu vào từ một đối số chuỗi và đầu ra cho bàn điều khiển), bạn cần gọi nó như thế này:

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

Chỉ sử dụng một cuộc gọi tại một thời điểm khi hàm sử dụng và sửa đổi các biến toàn cục.

Ung dung:

#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
}

Như bạn có thể thấy, ý tưởng chính là sử dụng cách tiếp cận dựa trên dữ liệu đầy đủ: Các phép quay khác nhau được thể hiện dưới dạng danh sách các chỉ số phải được hoán vị. Do đó, mã hoán vị có thể rất ngắn và chung chung.


2
Chào mừng đến với PPCG! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

Bạn có thể thực hiện các thao tác sau để lưu nhiều byte hơn: f(h,g)int*g;{-2, l(g,m){-8, n(char*o){-5, printf("%s",a)đến puts(a)-7, ngoài ra bạn có thể thay thế các hằng số char bằng biểu diễn thập phân ASCII của chúng -1 mỗi
Khaled.K


5

Về cơ bản , 2 byte

¶■

Hãy thử trực tuyến!

Giải trình:

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

Nếu đầu ra bên ngoài được cho phép, đây là một thay thế. 1 byte:

Hãy thử trực tuyến!

Về cơ bản, tự động kết xuất khối bộ nhớ của nó STDERRkhi chương trình kết thúc. Tuy nhiên, nó cũng in notepad trước.


2
Tôi không biết nên tán thưởng hay la ó bạn. +1
Jo King

@JoKing Cả. Giống như khi Cubw pwns các thách thức khối khác. 1 2 3
MD XF

4

JavaScript (ES6), 820

Một câu trả lời lỗi của @Paul Schmitz. Nó vẫn chưa hoàn toàn được đánh gôn, nhưng nó có giá trị gia tăng mà nó hoạt động.

Vấn đề chính trong câu trả lời ban đầu là một hàm Q không đủ cho tất cả các chuyển động liên quan đến một vòng quay. Tôi đã phải thêm 2 hàm khác O và N. Tất cả chúng chỉ được gọi trong hàm xoay phải 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],`
   $&`))

Dễ đọc hơn có lẽ

( 
  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>


Tôi nhận update()được không được xác định trong bảng điều khiển của tôi trong khi chạy đoạn trích
Kritixi Lithos

@KritixiLithos bạn có thể có lỗi sintax, vì không có trình duyệt tuân thủ ES6. Tôi đã thử nghiệm nó với Firefox, bạn đang sử dụng trình duyệt nào?
edc65

Tôi đang sử dụng Chrome
Kritixi Lithos

@KritixiLithos lỗi của tôi, có một dấu phẩy không cần thiết. Cố định
edc65
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.