Rubik's Cube Scrambled


21

Nhiệm vụ của bạn là tạo ra một chuỗi các bước di chuyển ngẫu nhiên, có thể được sử dụng để tranh giành khối Rubik. Một cuộc tranh giành như vậy được tạo thành từ chính xác 25 di chuyển. Mỗi di chuyển bao gồm các chữ cái UDRLFBtùy ý theo sau là một trong các hậu tố '2.

Ký hiệu này được gọi là ký hiệu Singmaster. UDRLFBđại diện cho một trong 6 mặt và hậu tố tùy chọn '2đại diện cho góc quay. Thông tin này là không cần thiết để giải quyết nhiệm vụ.

Để đảm bảo rằng các cuộc tranh giành có 'chất lượng tốt', hai quy tắc sau đây phải được áp dụng:

  • Hai động tác liên tiếp không được có cùng một chữ cái. Đây cấm việc di chuyển liên tục UU, DD, RR, LL, FFBBvà tất cả các kết hợp của họ bằng cách sử dụng hậu tố tùy chọn như U2Uhay U'U'.

    Các cặp di chuyển này bị cấm, bởi vì chúng có thể dễ dàng giảm xuống 1 hoặc 0 di chuyển. U2Ucó tác dụng tương tự U', R'Rtác dụng tương tự như .

  • Ba lần di chuyển liên tiếp không được thuộc cùng một nhóm chữ. Các nhóm thư là UD, RLFB. Quy tắc này bổ sung cấm việc di chuyển liên tục UDU, DUD, RLR, LRL, FBF, BFBvà tất cả các kết hợp của họ bằng cách sử dụng hậu tố tùy chọn như U2DU, RL'Rhoặc B2FB'.

    Các nhóm sắp xếp các mặt theo trục di chuyển của chúng. UDnằm trong cùng một nhóm, vì cả hai đều quay quanh cùng một trục. Do đó, một Uđộng tác không ảnh hưởng đến các phần của Dkhuôn mặt và một Ddi chuyển không ảnh hưởng đến các phần của Ukhuôn mặt. Do đó, hai động tác có thể được trao đổi, UDUcó tác dụng tương tự UUDvà điều này có thể được giảm xuống U2D.

Thử thách

Viết một kịch bản hoặc một hàm, tạo ra một sự xáo trộn ngẫu nhiên. Không có đầu vào. Tập lệnh / hàm phải in 25 di chuyển mà không tách hoặc tách bởi một khoảng trắng hoặc trả về chuỗi tương ứng.

Chương trình của bạn phải có khả năng tạo mọi tranh giành, đáp ứng các quy tắc trên. Tất nhiên, giả sử rằng trình tạo số ngẫu nhiên là ngẫu nhiên thực sự, và không giả ngẫu nhiên.

Đây là mã golf. Mã ngắn nhất (tính bằng byte ) sẽ thắng.

Ví dụ đầu ra:

Gọi script / hàm 3 lần sẽ in / trả về một cái gì đó như:

R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D

Nếu bạn tách di chuyển theo một khoảng trắng mỗi:

R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'

Lưu ý rằng tất cả các kết quả đầu ra này bao gồm 25 di chuyển, nhưng có độ dài khác nhau, do các hậu tố tùy chọn. Không được phép in một khoảng trắng, khi một trong hai 2hoặc 'được sử dụng làm hậu tố. Bạn phải in L2UR2F'R'U2hoặc L2 U R2 F' R' U2. L2U R2F'R'U2không được đồng ý.


Ý bạn UR 2là không được phép? U R2 Tôi nên cho phép, vì không gian giữa các lần di chuyển có ý nghĩa.
mbomb007

@ mbomb007 Ý tôi là những thứ như thế L2U R2F'R'U2. Ukhông có hậu tố tùy chọn và do đó không nên có một khoảng trắng. Một không gian không nên là một thay thế cho hậu tố tùy chọn.
Jakube

Nếu có khoảng trống giữa mỗi lần di chuyển thì sao? Chúng ta có thể đầu ra U F2 L D2 R'..., ví dụ? Trong trường hợp này, không có thêm một không gian, mà tôi nghĩ sẽ ổn theo quy tắc của bạn.
mbomb007

@ mbomb007 Vâng, tôi sẽ đưa nó vào mô tả.
Jakube

Không phải là 2 trước bức thư? oO
Oliver Ni

Câu trả lời:


6

CJam, 47 45 byte

Giải pháp này sử dụng một cách tiếp cận khác với bất kỳ cách đăng nào khác cho đến nay. Nó tận dụng các hoạt động danh sách ngắn gọn của CJam để tạo danh sách di chuyển có sẵn và chọn ngẫu nhiên một danh sách mỗi iteraton. Công cụ sửa đổi được tạo ra một cách độc lập.

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

{BA^2/6,_B-?A:B-mr0=:A"UDRLFB"=3mr[L2'']=}25*

Giải trình

{               "Loop...";
  BA^2/           "If the two previous moves were not from the same group, ...";
  6,              "... then produce the available move list [0 1 2 3 4 5], ...";
  _B-             "... else produce the available move list [0 1 2 3 4 5] with
                   the second previous move removed";
  ?
  A:B             "Save the previous move as the second previous move";
  -               "Remove the previous move from the available move list";
  mr0=            "Randomly select an available move";
  :A              "Save this move as the previous move";
  "UDRLFB"=       "Map this move to its character (implicitly printed)";
  3mr[L2'']=      "Randomly select a modifier (implicitly printed)";
}25*            "... 25 times";

9

C, 129

f(){int i,n,m,r,s,t;for(i=26;i--;i<25&&printf("%c%c","URFDLB"[s%6],"'2"[r%3])){for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;s+=m;}}

Vòng lặp bên trong tạo ra một giá trị mtrong phạm vi 1..5mà khi được thêm vào svà lấy modulo 6, đảm bảo rằng không có hai chuyển động liên tiếp ở cùng một phía của khối. Giá trị cũ của mđược lưu trữ trong nvà kiểm tra m*n==9đảm bảo rằng giá trị m= 3 không bao giờ được tạo hai lần liên tiếp (vì vậy các mặt đối diện không thể được chọn hai lần liên tiếp; lưu ý thứ tự các mặt trong chuỗi.)

Phần quan trọng nhất của rđược sử dụng để quyết định hậu tố ( ', 2hoặc null) để sử dụng, lợi dụng các ký tự null vào cuối "'2".

Vòng lặp bên ngoài chạy 26 lần. Lần đầu tiên, Ukhông bao giờ có thể được chọn, vì vậy printfbị loại bỏ cho lần lặp đầu tiên.

Mã bị lỗi trong chương trình thử nghiệm

Mã không mã hóa đặt một khoảng trống giữa mỗi lần di chuyển cho rõ ràng (mã được đánh golf không, để tiết kiệm một byte.) Ngoài ra, mã golf đã lưu một dấu chấm phẩy bằng cách đặt lại dấu ngoặc printftrong forkhung.

f(){
  int i,n,m,r,s,t;
  for(i=26;i--;){
    for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;
    s+=m;
    i<25&&printf("%c%c ","URFDLB"[s%6],"'2"[r%3]);
  }
}

main(){
  int j;
  srand(time(0));
  for(j=0;j<5;j++)f(), puts("");
}

Sản lượng tiêu biểu

U' B D2 B' R' L F' D2 B D2 B2 R' B2 U D2 F' R U R' L B' L R2 B2 F'
U B U B F L2 D2 B' U' L B L R' D B U' D R D' B' F2 D' B D R
L D F2 B2 R' U F B' D2 L U R' L' U2 F' R F D U2 B L' B' U L2 F'
R2 B' F2 R2 L2 F' U2 L U' B' F R' D' F2 D F' L2 U2 R' D' B2 D F R2 L'
U2 F2 B2 D' F D F R L2 U' B D2 L' R D R F2 R' F2 U2 D R' D2 L F2



4

Bình thường 65 66

Tôi chưa bao giờ thực sự chơi gôn ở Pyth, có thể viết một hoặc hai chương trình. Về cơ bản , đây là giải pháp của @ steveverrill được dịch sang Pyth. Đề xuất cải tiến được chào đón.

Cập nhật: thêm 1 byte để tạo sự xáo trộn cũng bắt đầu bằng U. Có lẽ giải pháp C đang dựa vào hành vi không xác định để làm cho nó hoạt động ...

=YO6V25JZK1WK=GO15=Z/+3G3=Kq9*ZJ)~YZpd+@"URFDLB"%Y6?@"'2"%G3>2%G3k

Tôi tin rằng điều này nên được thực hiện với ít bài tập hơn, nhưng điều đó sẽ đòi hỏi tôi phải sửa đổi thuật toán rất nhiều. (Chà, có thể thử.)

Đây là một lời giải thích dựa trên mã C:

=YO6           s = random.choice(range(6))
V25            for i in range(25):
  JZ               n = m
  K1               t = 1
  WK               while t:
    =GO15              r = random.choice(range(15))
    =Z/+3G3            m = (r + 3) / 3
    =Kq9*ZJ            t = 9 == m * n
  )
  ~YZ              s += m
  pd               print(..., end = " ")
  +                ... + ...
  @"URFDLB"%Y6     "URFDLB"[s % 6]
  ?@"'2"%G3>2%G3k  "'2"[G % 3] if 2 > G % 3 else ""

Chuyển đổi các biến YZ. Zđược preinitialized với 0, vì vậy bạn lưu 3 ký tự đầu tiên.
Jakube

@Jakube Nhưng sau đó tôi cần đặt n = m(dòng giải thích thứ 3), nghĩa là n = 0lần đầu tiên, lần lượt sẽ phải Ylà 0.
PurkkaKoodari

Yđược preinitialized với một danh sách trống []. Và tôi không nghĩ giá trị của các nvấn đề trong lần lặp đầu tiên.
Jakube

Btw, mã của bạn không tạo ra sự xáo trộn bắt đầu bằng U.
Jakube

@Jakube cảm ơn, đã sửa.
PurkkaKoodari 6/03/2015

4

JavaScript (ES6) 175 178 204

Chỉnh sửa ít hơn 3 byte, 1 bằng cách thay đổi mã và 2 bằng cách thay đổi cách tính byte (không tính F=)

Mã để tránh lặp lại được lấy từ @stevemiller. Cách quản lý các nhóm thư của anh ấy thậm chí còn tốt hơn, nhưng tôi sẽ không đánh cắp nó.

Phần thưởng: bạn có thể tùy ý chỉ định số lượng di chuyển.

(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

Ít chơi gôn

(n = 25) => 
{
  R = n => Math.random()*n | 0;
  N = _ => 'UDRLFB'[(r += 1+R(5)) % 6];
  r = 0;
  b = N();
  a = N();
  for(s = '' ; n; )
     c = N(),
     ~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')
       ? 0
       : s += (--n, a=b, b=c) + ["","'",2][R(3)];
  return s
}

Kiểm tra

var F=
(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

function go() {
  console.log(F(+M.value))
}

go()
Moves <input type=number min=1 id=M value=25 max=999>
<button onclick='go()'>Test</button>


2

Javascript - 112

for(c=b=j=25,r=Math.random;j;c+b-5|c-m&&b-m?document.write("URFBLD"[j--,c=b,b=m]+" 2'"[0|r()*3]+" "):0)m=0|r()*6



1

Clojure, 223 byte

(let[R(range)F(fn[f p c](apply concat(filter f(partition-by p c))))](apply str(map str(take 25(F(fn[p](<(count p)3))(zipmap"UDLF""1122")(F(fn[p](=(count p)1))int(for[_ R](rand-nth"UDRLFB")))))(for[_ R](rand-nth[""\'\2])))))

Điều này phụ thuộc rất nhiều vào mẫu "trình tự -> phân vùng -> bộ lọc -> concat", nó được sử dụng để lọc ra các chuỗi "bất hợp pháp" của khuôn mặt. Seq này sau đó được ánh xạ thành chuỗi cùng với một hậu tố ngẫu nhiên (bao gồm cả chuỗi trống).

Xuất phát điểm:

(->> (for[_(range)](rand-nth"UDRLFB"))
     (partition-by int)           ; "identity" would be the correct fn to use here
     (filter(fn[p](=(count p)1))) ; Only one identical value in partition
     (apply concat)
     (partition-by(zipmap"UDLF""1122")) ; R & B are in the implicit nil group
     (filter(fn[p](<(count p)3)))       ; Only 1 or 2 consecutive faces from a group
     (apply concat)
     (take 25))
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.