Trong khi nhàn rỗi vặn khối Rubik của tôi xung quanh, con trai tôi nhận thấy rằng nó tiếp tục trở lại trạng thái đã giải quyết. Tôi khá chắc chắn rằng anh ấy nghĩ rằng đây là một loại ma thuật tà thuật lúc đầu, nhưng tôi đã giải thích rằng nếu bạn cứ lặp đi lặp lại cùng một chuỗi động tác, nó sẽ luôn trở về trạng thái ban đầu. Cuối cùng.
Tất nhiên, là một đứa trẻ, anh ta phải tự mình thử và chọn một chuỗi "ngẫu nhiên" mà anh ta nghĩ sẽ khó khăn. Anh ta mất dấu sau mười lần lặp lại, và hỏi tôi anh ta sẽ phải lặp lại bao nhiêu lần. Không biết trình tự anh ta đang sử dụng, tôi nói với anh ta rằng tôi không biết, nhưng chúng tôi có thể viết một chương trình để tìm hiểu.
Đây là nơi bạn đến. Tất nhiên, tôi chỉ có thể làm gì đó, nhưng anh ấy muốn tự mình gõ nó. Tuy nhiên, anh ấy không phải là người đánh máy rất nhanh, vì vậy tôi cần chương trình ngắn nhất có thể .
Mục tiêu
Đưa ra một chuỗi các lượt, xuất số lần ít nhất phải được thực hiện để đưa khối lập phương về trạng thái ban đầu. Đây là mã golf, vì vậy ít byte nhất sẽ thắng. Bạn có thể viết một chương trình hoặc chức năng và tất cả các mặc định thông thường khác được áp dụng.
Đầu vào
Đầu vào là một chuỗi các bước di chuyển, được lấy dưới dạng chuỗi, danh sách hoặc định dạng khác phù hợp với ngôn ngữ của bạn. Vui lòng sử dụng dấu phân cách (hoặc không) giữa các lần di chuyển nếu ở dạng chuỗi.
Có sáu động thái "cơ bản" phải được tính đến, cùng với các nghịch đảo của chúng:
R - Turn the right face clockwise
L - Turn the left face clockwise
U - Turn the up (top) face clockwise
D - Turn the down (bottom) face clockwise
F - Turn the front face clockwise
B - Turn the back face clockwise
Các nghịch đảo được thể hiện bằng cách thêm một dấu nguyên tố '
sau chữ cái. Điều này cho thấy bạn xoay mặt đó theo chiều ngược chiều kim đồng hồ, do đó F'
quay mặt trước ngược chiều kim đồng hồ và F F'
sẽ đưa nó trở về trạng thái ban đầu ngay lập tức.
Đối với những người quan tâm, thử thách này đang sử dụng một bộ Ký hiệu Singmaster giới hạn . Ruwix có một số hình ảnh động đẹp nếu bạn muốn xem nó hoạt động.
Đầu ra
Đầu ra chỉ đơn giản là số lần tối thiểu mà chuỗi đầu vào phải được thực hiện.
Ví dụ
Input Output
FF' -> 1
R -> 4
RUR'U' -> 6
LLUUFFUURRUU -> 12
LUFFRDRBF -> 56
LF -> 105
UFFR'DBBRL' -> 120
FRBL -> 315
Đây là một trình giải (khá ngây thơ) để so sánh các câu trả lời của bạn với, được viết bằng Java. Nó cũng chấp nhận 2
cho di chuyển kép (vì vậy trường hợp thứ tư là tương đương L2U2F2U2R2U2
).
import java.util.ArrayList;
import java.util.List;
public class CycleCounter{
public static void main(String[] args){
int[] cube = new int[54];
for(int i=0;i<54;i++)
cube[i] = i;
String test = args.length > 0 ? args[0] : "RUR'U'";
List<Rotation> steps = parse(test);
System.out.println(steps.toString());
int count = 0;
do{
for(Rotation step : steps)
cube = step.getRotated(cube);
count++;
}while(!isSorted(cube));
System.out.println("Cycle length for " + test + " is " + count);
}
static List<Rotation> parse(String in){
List<Rotation> steps = new ArrayList<Rotation>();
for(char c : in.toUpperCase().toCharArray())
switch(c){
case 'R':steps.add(Rotation.R);break;
case 'L':steps.add(Rotation.L);break;
case 'U':steps.add(Rotation.U);break;
case 'D':steps.add(Rotation.D);break;
case 'F':steps.add(Rotation.F);break;
case 'B':steps.add(Rotation.B);break;
case '\'':
steps.add(steps.get(steps.size()-1));
case '2':
steps.add(steps.get(steps.size()-1));
break;
}
return steps;
}
static boolean isSorted(int[] in){for(int i=0;i<in.length-1;i++)if(in[i]>in[i+1])return false;return true;}
enum Rotation{
R(new int[]{-1,-1,42,-1,-1,39,-1,-1,36, -1,-1,2,-1,-1,5,-1,-1,8, 20,23,26,19,-1,25,18,21,24, -1,-1,11,-1,-1,14,-1,-1,17, 35,-1,-1,32,-1,-1,29,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1}),
L(new int[]{9,-1,-1,12,-1,-1,15,-1,-1, 27,-1,-1,30,-1,-1,33,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, 44,-1,-1,41,-1,-1,38,-1,-1, -1,-1,6,-1,-1,3,-1,-1,0, 47,50,53,46,-1,52,45,48,51}),
U(new int[]{2,5,8,1,-1,7,0,3,6, 45,46,47,-1,-1,-1,-1,-1,-1, 9,10,11,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, 18,19,20,-1,-1,-1,-1,-1,-1, 36,37,38,-1,-1,-1,-1,-1,-1}),
D(new int[]{-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,24,25,26, -1,-1,-1,-1,-1,-1,42,43,44, 29,32,35,28,-1,34,27,30,33, -1,-1,-1,-1,-1,-1,51,52,53, -1,-1,-1,-1,-1,-1,15,16,17}),
F(new int[]{-1,-1,-1,-1,-1,-1,18,21,24, 11,14,17,10,-1,16,9,12,15, 29,-1,-1,28,-1,-1,27,-1,-1, 47,50,53,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,8,-1,-1,7,-1,-1,6}),
B(new int[]{51,48,45,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,0,-1,-1,1,-1,-1,2, -1,-1,-1,-1,-1,-1,26,23,20, 38,41,44,37,-1,43,36,39,42, 33,-1,-1,34,-1,-1,35,-1,-1});
private final int[] moves;
Rotation(int[] moves){
this.moves = moves;
}
public int[] getRotated(int[] cube){
int[] newCube = new int[54];
for(int i=0;i<54;i++)
if(moves[i]<0)
newCube[i] = cube[i];
else
newCube[moves[i]] = cube[i];
return newCube;
}
}
}