मेरे रुबिक के क्यूब को इधर-उधर घुमाते हुए, मेरे बेटे ने देखा कि यह सुलझी हुई अवस्था में वापस जा रहा है। मुझे पूरा यकीन है कि उसने सोचा था कि यह पहली बार जादू जादू था, लेकिन मैंने समझाया कि यदि आप चालों के उसी क्रम को दोहराते रहेंगे, तो यह हमेशा अपनी मूल स्थिति में लौट आएगा। अंततः।
बेशक, एक बच्चा होने के नाते, उसे खुद के लिए इसे आज़माना था और एक "यादृच्छिक" अनुक्रम चुना जिसे उसने सोचा कि यह मुश्किल होगा। उसने दस बार दोहराए जाने के बाद ट्रैक खो दिया, और मुझसे पूछा कि उसे कितनी बार दोहराना होगा। वह जिस अनुक्रम का उपयोग कर रहा था, उसे नहीं जानकर, मैंने उससे कहा कि मुझे नहीं पता, लेकिन यह पता लगाने के लिए हम एक कार्यक्रम लिख सकते हैं।
यह वह जगह है जहाँ आप आते हैं। बेशक, मैं कुछ कोड़ा मार सकता था, लेकिन वह इसे खुद में टाइप करना चाहता था। वह अभी तक बहुत तेज टाइपिस्ट नहीं है, लेकिन मुझे सबसे कम कार्यक्रम की आवश्यकता है ।
उद्देश्य
क्यूब्स के अनुक्रम को देखते हुए, क्यूब को उसकी मूल स्थिति में वापस करने के लिए सबसे कम संख्या में आउटपुट करना होगा। यह कोड गोल्फ है, इसलिए कम से कम बाइट्स जीतता है। आप एक प्रोग्राम या फ़ंक्शन लिख सकते हैं, और अन्य सभी सामान्य चूक लागू होते हैं।
इनपुट
इनपुट चालों का एक क्रम है, जिसे एक स्ट्रिंग, सूची या आपकी भाषा के लिए उपयुक्त अन्य प्रारूप के रूप में लिया जाता है। स्ट्रिंग रूप में अगर चाल के बीच एक विभाजक (या नहीं) का उपयोग करने के लिए स्वतंत्र महसूस करें।
छह "मूल" चालें हैं जिन्हें अपने आक्रमण के साथ ध्यान में रखा जाना चाहिए:
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'
इसे तुरंत मूल स्थिति में लौटा देगा।
रुचि के लिए, यह चुनौती सिंगमास्टर नोटेशन के सीमित सेट का उपयोग कर रही है । यदि आप इसे कार्रवाई में देखना चाहते हैं तो 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;
}
}
}