내 루빅스 큐브를 엉망 으로 돌리는 동안 아들은 계속 문제가 해결 된 상태로 돌아가는 것을 알아 차렸다. 나는 이것이 처음에는 일종의 부두 마법이라고 생각하지만, 만약 당신이 같은 동작을 계속 반복하면 항상 원래 상태로 돌아갈 것이라고 설명했다. 결국.
물론, 어렸을 때, 그는 스스로 시도해보고 까다로울 것이라고 생각되는 "무작위"순서를 골랐습니다. 그는 10 번 정도 반복 한 후에 길을 잃었고 몇 번이나 반복해야하는지 물었다. 그가 사용하고있는 순서를 모르면서 나는 모른다고 말했지만 우리는 알아낼 프로그램을 작성할 수 있다고 말했다.
당신이 올 곳 나는, 물론.입니다 수 단지 채찍 일까지, 그러나 그는 자신에 입력하고 싶습니다. 그는 아직 타이 포스트가 아니기 때문에 가능한 가장 짧은 프로그램이 필요 합니다 .
객관적인
회전 순서가 주어지면 큐브를 원래 상태로 되돌릴 때 수행해야하는 횟수가 가장 적습니다. 이것은 코드 골프이므로 최소 바이트가 이깁니다. 프로그램이나 함수를 작성할 수 있으며 다른 모든 일반적인 기본값이 적용됩니다.
입력
입력은 문자열, 목록 또는 사용자 언어에 적합한 다른 형식으로 된 일련의 동작입니다. 문자열 형태 인 경우 이동 사이에 구분 기호를 사용하거나 사용하지 마십시오.
그 반대와 함께 고려해야 할 6 가지 "기본"동작이 있습니다.
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
역은 '
문자 다음에 소수를 추가하여 표시 됩니다. 이것은면을 시계 반대 방향으로 돌리므로 앞면을 시계 반대 방향 F'
으로 돌리면 F F'
원래 상태로 즉시 돌아갑니다.
관심을 끌기 위해이 과제는 제한된 Singmaster Notation 세트를 사용하고 있습니다. Ruwix에는 실제 애니메이션 을보고 싶은 멋진 애니메이션 이 있습니다.
산출
출력은 입력 시퀀스를 수행해야하는 최소 횟수입니다.
예
Input Output
FF' -> 1
R -> 4
RUR'U' -> 6
LLUUFFUURRUU -> 12
LUFFRDRBF -> 56
LF -> 105
UFFR'DBBRL' -> 120
FRBL -> 315
다음은 자바로 작성된 답변과 비교할 수있는 (순진한) 솔버입니다. 또한 2
이중 이동 도 허용 합니다 (따라서 네 번째 경우는와 동일 함 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;
}
}
}