আমার রবিকের ঘনক্ষনটি চারদিকে ঘোরাঘুরি করার সময়, আমার ছেলে লক্ষ্য করেছে যে এটি পুনরায় সমাধান হওয়া অবস্থায় চলেছে। আমি নিশ্চিত যে তিনি ভেবেছিলেন যে এটি প্রথমে ভুডু যাদু ছিল কিছুটা, তবে আমি ব্যাখ্যা করেছিলাম যে আপনি যদি একই পদক্ষেপের পুনরাবৃত্তি করতে থাকেন তবে এটি সর্বদা তার আসল অবস্থায় ফিরে আসবে। অবশেষে.
অবশ্যই, একটি ছাগলছানা হওয়ার কারণে, তাকে নিজের জন্য এটি চেষ্টা করে দেখতে হবে এবং একটি "এলোমেলো" ক্রমটি বেছে নিয়েছিলেন যা তিনি ভাবেন যে এটি কৌশলটি জটিল। দশ বা তার পুনরাবৃত্তি করার পরে তিনি ট্র্যাকটি হারিয়ে ফেললেন এবং আমাকে জিজ্ঞাসা করলেন যে এটির পুনরাবৃত্তি করতে তাকে কতবার করতে হবে। তিনি যে ক্রমটি ব্যবহার করছেন তা না জেনে আমি তাকে বলেছিলাম যে আমি জানি না, তবে আমরা এটির জন্য একটি প্রোগ্রাম লিখতে পারি।
আপনি এখানে এসেছেন course অবশ্যই, আমি কেবল কিছুটা চাবুক মারতে পারলাম , তবে সে নিজের মধ্যে এটি টাইপ করতে চাই। তিনি এখনও খুব দ্রুত টাইপিস্ট নন, যদিও আমার পক্ষে সবচেয়ে সংক্ষিপ্ততম প্রোগ্রামের প্রয়োজন ।
উদ্দেশ্য
ঘুরার ক্রম দেওয়া, কিউবটিকে তার মূল অবস্থায় ফিরিয়ে আনার জন্য সবচেয়ে কম সংখ্যক বার আউটপুট আউটপুট করুন। এটি কোড গল্ফ, তাই কমপক্ষে বাইটস জেতা। আপনি কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন এবং অন্যান্য সমস্ত স্বাভাবিক ডিফল্ট প্রযোজ্য।
ইনপুট
ইনপুটটি আপনার ভাষার জন্য উপযুক্ত স্ট্রিং, তালিকা, বা অন্য ফর্ম্যাট হিসাবে গৃহীত চলার ক্রম। স্ট্রিং আকারে চলার মধ্যে একটি বিভাজক (বা না) ব্যবহার করতে দ্বিধা বোধ করুন।
এখানে ছয়টি "বেসিক" মুভ রয়েছে যা তাদের বিপরীতগুলির সাথে অবশ্যই বিবেচনায় নেওয়া উচিত:
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'
এটি মূল অবস্থায় ফিরে আসবে।
আগ্রহীদের জন্য, এই চ্যালেঞ্জটি সিঙ্গমাস্টার নোটেশনের একটি সীমিত সেট ব্যবহার করছে । আপনি যদি এটি অ্যাকশনে দেখতে চান তবে রুউইজের কিছু দুর্দান্ত অ্যানিমেশন রয়েছে ।
আউটপুট
আউটপুট হ'ল ইনপুট ক্রমটি সম্পাদন করতে হবে এমন সর্বনিম্ন সংখ্যা।
উদাহরণ
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;
}
}
}