ในขณะที่กำลังบิดลูกบาศก์ของรูบิคโดยไม่ได้ใช้งานลูกชายของฉันสังเกตเห็นว่ามันกลับไปสู่สถานะที่แก้ไขแล้ว ฉันค่อนข้างแน่ใจว่าเขาคิดว่านี่เป็นเวทย์มนตร์ของวูดูในตอนแรก แต่ฉันอธิบายว่าถ้าคุณทำซ้ำการเคลื่อนไหวตามลำดับที่เหมือนกันมันจะกลับสู่สถานะดั้งเดิมเสมอ ในที่สุด
แน่นอนว่าเป็นเด็กเขาต้องลองด้วยตัวเองและเลือกลำดับ "แบบสุ่ม" ที่เขาคิดว่าจะยุ่งยาก เขาหลงทางหลังจากผ่านไปสิบครั้งซ้ำแล้วซ้ำอีกและถามฉันว่าเขาจะต้องทำซ้ำกี่ครั้ง ไม่รู้ว่าเขากำลังใช้ลำดับฉันบอกเขาว่าฉันไม่รู้ แต่เราสามารถเขียนโปรแกรมเพื่อค้นหา
นี่คือที่ที่คุณเข้ามาแน่นอนว่าฉันสามารถทำอะไรบางอย่างได้ แต่เขาต้องการพิมพ์ด้วยตัวเอง เขาไม่ได้เป็นไปอย่างรวดเร็วมากพิมพ์ดีด ๆ แม้ว่าดังนั้นฉันต้องการโปรแกรมที่สั้นที่สุด
วัตถุประสงค์
กำหนดลำดับการเลี้ยวเอาท์พุทจำนวนครั้งน้อยที่สุดที่จะต้องดำเนินการเพื่อกลับสู่สภาพเดิม นี่คือรหัสกอล์ฟอย่างน้อยไบต์จะชนะ คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นและใช้ค่าเริ่มต้นตามปกติอื่น ๆ ทั้งหมด
อินพุต
การป้อนข้อมูลคือลำดับของการย้ายถ่ายเป็นสตริงรายการหรือรูปแบบอื่น ๆ ที่เหมาะสมกับภาษาของคุณ รู้สึกอิสระที่จะใช้ตัวคั่น (หรือไม่) ระหว่างการเคลื่อนไหวถ้าในรูปแบบสตริง
มีการเคลื่อนไหว "พื้นฐาน" หกประการที่จะต้องนำมาพิจารณาพร้อมกับผู้รุกราน:
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 โน้ต Ruwix มีอนิเมชั่นที่ดีถ้าคุณอยากเห็นมันใช้งานจริง
เอาท์พุต
เอาต์พุตเป็นจำนวนครั้งต่ำสุดที่ต้องดำเนินการตามลำดับอินพุต
ตัวอย่าง
Input Output
FF' -> 1
R -> 4
RUR'U' -> 6
LLUUFFUURRUU -> 12
LUFFRDRBF -> 56
LF -> 105
UFFR'DBBRL' -> 120
FRBL -> 315
ต่อไปนี้เป็นตัวแก้ปัญหา (ไร้เดียงสา) เพื่อเปรียบเทียบคำตอบของคุณเขียนใน Java นอกจากนี้ยังยอมรับ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;
}
}
}