রুবিকের সাথে সাইকেল চালানো


43

আমার রবিকের ঘনক্ষনটি চারদিকে ঘোরাঘুরি করার সময়, আমার ছেলে লক্ষ্য করেছে যে এটি পুনরায় সমাধান হওয়া অবস্থায় চলেছে। আমি নিশ্চিত যে তিনি ভেবেছিলেন যে এটি প্রথমে ভুডু যাদু ছিল কিছুটা, তবে আমি ব্যাখ্যা করেছিলাম যে আপনি যদি একই পদক্ষেপের পুনরাবৃত্তি করতে থাকেন তবে এটি সর্বদা তার আসল অবস্থায় ফিরে আসবে। অবশেষে.

অবশ্যই, একটি ছাগলছানা হওয়ার কারণে, তাকে নিজের জন্য এটি চেষ্টা করে দেখতে হবে এবং একটি "এলোমেলো" ক্রমটি বেছে নিয়েছিলেন যা তিনি ভাবেন যে এটি কৌশলটি জটিল। দশ বা তার পুনরাবৃত্তি করার পরে তিনি ট্র্যাকটি হারিয়ে ফেললেন এবং আমাকে জিজ্ঞাসা করলেন যে এটির পুনরাবৃত্তি করতে তাকে কতবার করতে হবে। তিনি যে ক্রমটি ব্যবহার করছেন তা না জেনে আমি তাকে বলেছিলাম যে আমি জানি না, তবে আমরা এটির জন্য একটি প্রোগ্রাম লিখতে পারি।

আপনি এখানে এসেছেন 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;
        }
    }
}

"ক্লকওয়াইজ" এর অর্থ "আপনি যখন মুখোমুখি হন তখন ঘড়ির কাঁটা" আমি ধরে নিই?
এমএস 210

@ msh210 সঠিক
জিওবিটস

7
পদযাত্রার এক বিন্দুতে, আমি মনে করি আপনার এটি স্পষ্ট করে দেওয়া উচিত যে আপনি সবচেয়ে ছোট সংখ্যাটি চান যা যথেষ্ট। অন্যথায় আমি কেবলমাত্র গ্রুপের আকার আউটপুট এবং লেগ্রঞ্জের উপপাদ্য তুলে ধরতে পারি ...
পিটার টেলর

2
@ পিটারটেলর পেডেন্ট্রি গৃহীত হয়েছে।
জিওবিটস

4
আমি পারে এলোমেলো একটি সমাধান জন্য 500 বিন্দু খয়রাত অফার। এখনো নিশ্চিত না.
lirtosiast

উত্তর:


16

পাইথ, 66 63 বাইট

l.uum.rW}Hdd@_sm_B.iFP.>c3Zk3xZHG_r_Xz\'\39Nf!s}RTcZ2y=Z"UDLRFB

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট । লক্ষ্য করুন যে প্রোগ্রামটি ধীরে ধীরে ধীরে ধীরে এবং অনলাইন সংকলক এর জন্য উত্তরটি গণনা করতে সক্ষম নয় RU2D'BD'। তবে আশ্বাস দিন, এটি আমার ল্যাপটপে প্রায় 12 সেকেন্ডের মধ্যে এটি গণনা করতে পারে।

প্রোগ্রামটি (দুর্ঘটনাক্রমে) 2দ্বিগুণ পদক্ষেপের জন্যও গ্রহণ করে।

সম্পূর্ণ ব্যাখ্যা:

পার্স স্ক্যাম্বেল:

প্রথমে আমি 'ইনপুট স্ট্রিংগুলিতে প্রাথমিক চিহ্নগুলি নিয়ে কাজ করব । আমি কেবল 3এই স্ট্রিংটি দিয়ে রান-লেন্থের ডিকোড দিয়ে প্রতিস্থাপন করি । যেহেতু পাইথের ডিকোডিং ফর্ম্যাটটিতে চরের সামনে সংখ্যাটি প্রয়োজন, তাই আমি আগেই স্ট্রিংটি বিপরীত করি। _r_Xz\'\39। সুতরাং পরে আমি এটি আবার বিপরীত।

সমাধান করা কিউব রাজ্যের বর্ণনা দিন:

=Z"UDLRFBসমস্ত 6 টি পদক্ষেপে স্ট্রিং বরাদ্দ করে Z

আমরা প্রতিটি কিউব পিসের অবস্থান বর্ণনা করে একটি ঘনক্ষেত্রের অবস্থা বর্ণনা করতে পারি। উদাহরণস্বরূপ আমরা বলতে পারি যে প্রান্তটি ইউএল (আপ-বাম) এ হওয়া উচিত বর্তমানে এফআর (সম্মুখ-ডান) এ। আমি এই জন্যই মীমাংসিত ঘনক্ষেত্র সব টুকরা উৎপন্ন করা প্রয়োজন: f!s}RTcZ2yZyZএর সমস্ত সম্ভাব্য উপগ্রহ তৈরি করে "UDLRFB"। এটি স্পষ্টতই সাবসেট "UDLRFB"এবং সাবসেটও উত্পন্ন করে "UD"। প্রথমটি কোনও তাত্পর্যপূর্ণ নয়, যেহেতু কোনও অংশ নেই যা সমস্ত sides দিক থেকে দৃশ্যমান, এবং দ্বিতীয়টি কোনও অর্থ বোধ করে না, যেহেতু কোনও প্রান্তের টুকরা নেই, এটি শীর্ষ এবং নীচে থেকে দৃশ্যমান । অতএব আমি সমস্ত সাবসেটগুলি সরিয়ে দিচ্ছি, যাতে উপসর্গ রয়েছে "UD", "LR"বা "FB"। এটি আমাকে নিম্নলিখিত 27 টি টুকরা দেয়:

'', 'U', 'D', 'L', 'R', 'F', 'B', 'UL', 'UR', 'UF', 'UB', 'DL', 'DR', 'DF', 'DB', 
'LF', 'LB', 'RF', 'RB', 'ULF', 'ULB', 'URF', 'URB', 'DLF', 'DLB', 'DRF', 'DRB'

এটিতে খালি স্ট্রিং এবং ছয়টি 1-অক্ষরের স্ট্রিংও অন্তর্ভুক্ত রয়েছে। আমরা এগুলিকে কিউবের মাঝখানে টুকরা এবং 6 টি কেন্দ্রের টুকরো হিসাবে ব্যাখ্যা করতে পারি। স্পষ্টতই এগুলি প্রয়োজন হয় না (যেহেতু তারা সরে না) তবে আমি তাদের রাখব।

কিছু পদক্ষেপ নেওয়া:

আমি একটি পদক্ষেপ সম্পাদন করতে কিছু স্ট্রিং অনুবাদ করব। ধারণাটি দেখার জন্য কোণার অংশটি দেখুন URF। এটি কি ঘটবে, যখন আমি একটি Rসরানো করি? স্টিকার Uমুখে প্যাচসমূহ Bমুখ, স্টিকার Fচলে আসে Uমুখ এবং স্টিকার Rএ মুখ থাকার বিষয়টি মতেই Rমুখ। আমরা বলতে পারি যে টুকরাটি URFস্থানটিতে চলে যায় BRU। এই প্যাটার্নটি ডান পাশের সমস্ত টুকরা জন্য সত্য। প্রতিটি স্টিকার যে Fমুখে প্যাচসমূহ Uমুখ যখন একটি Rপদক্ষেপ সঞ্চালিত হয়, যে স্টিকার যে Uমুখে প্যাচসমূহ Bমুখ, প্রতি স্টিকার Bথেকে প্যাচসমূহ Dউপরে ও প্রত্যেকটা স্টিকার Dথেকে প্যাচসমূহF। আমরা Rযেমন একটি পদক্ষেপের পরিবর্তনগুলি ডিকোড করতে পারি FUBD

নিম্নলিখিত কোডটি 6 টি প্রয়োজনীয় কোড উত্পন্ন করে:

_sm_B.iFP.>c3Zk3
['BRFL', 'LFRB', 'DBUF', 'FUBD', 'RDLU', 'ULDR']
    ^       ^       ^       ^       ^       ^
 U move  D move  L move  R move  F move  B move

এবং আমরা নিম্নলিখিত হিসাবে Hকিউব স্থিতিতে একটি পদক্ষেপ সম্পাদন করি G:

m.rW}Hdd@...xZHG
m              G   map each piece d in G to:
 .rW   d              perform a rotated translation to d, but only if:
    }Hd                  H appears in d (d is currently on the face H)
            xZH           get the index of H in Z
        @...              and choose the code in the list of 6 (see above)

পুনরাবৃত্তি সংখ্যা গণনা করুন:

বাকিগুলি বেশ তুচ্ছ। আমি পূর্বে যে কোনও অবস্থানে গিয়ে পৌঁছেছি এমন অবস্থানে না পৌঁছানো পর্যন্ত আমি কেবল সমাধান করা কিউবটিকে আরও বেশি করে ইনপুট স্ক্র্যাম্বেল সম্পাদন করি।

l.uu<apply move H to G><parsed scramble>N<solved state>
u...N   performs all moves of the scramble to the state N
.u...   do this until cycle detected, this returns all intermediate states
l       print the length

13

জিএপি, 792 783 782 749 650 বাইট

এটি কাজ করছে বলে মনে হচ্ছে। যদি এটি কোনও কিছু নিয়ে গণ্ডগোল করে তবে আমাকে জানান।

আমি কিছু আদিম পদক্ষেপগুলি পচিয়ে দেওয়ার পরামর্শ দেওয়ার জন্য @ লিনকে ধন্যবাদ জানাই।

Inverse(X)আমি ব্যবহারের পরিবর্তে পরামর্শ দেওয়ার জন্য @ নীলকে ধন্যবাদ জানাই X^3

ব্যবহারের উদাহরণ: f("R");

R:=(3,39,21,48)(6,42,24,51)(9,45,27,54)(10,12,18,16)(13,11,15,17);L:=(1,46,19,37)(4,49,22,40)(7,52,25,43)(30,36,34,28)(29,33,35,31);U:=(1,10,27,28)(2,11,26,29)(3,12,25,30)(37,43,45,39)(40,44,42,38);A:=R*L^3*F*F*B*B*R*L^3;D:=A*U*A;;F:=(1,3,9,7)(2,6,8,4)(10,48,36,43)(13,47,33,44)(16,46,30,45);B:=(27,25,19,21)(26,22,20,24)(39,28,52,18)(38,31,53,15)(37,34,54,12);d:=NewDictionary((),true);AddDictionary(d,'R',R);AddDictionary(d,'L',L);AddDictionary(d,'U',U);AddDictionary(d,'D',D);AddDictionary(d,'F',F);AddDictionary(d,'B',B);f:=function(s) local i,p,b,t;p:=();
for c in s do if c='\'' then t:=t^2;else t:=LookupDictionary(d,c);fi;p:=p*t;od;return Order(p);end;

এখানে একটি বিট ব্যাখ্যা দিয়ে প্রকট কোডটি দেওয়া হয়েছে

  # Here we define the primitive moves
R:=(3,39,21,48)(6,42,24,51)(9,45,27,54)(10,12,18,16)(13,11,15,17);
L:=(1,46,19,37)(4,49,22,40)(7,52,25,43)(30,36,34,28)(29,33,35,31);
U:=(1,10,27,28)(2,11,26,29)(3,12,25,30)(37,43,45,39)(40,44,42,38);
#D:=(7,34,21,16)(8,35,20,17)(9,36,19,18)(48,46,52,54)(47,49,53,51);
F:=(1,3,9,7)(2,6,8,4)(10,48,36,43)(13,47,33,44)(16,46,30,45);
B:=(27,25,19,21)(26,22,20,24)(39,28,52,18)(38,31,53,15)(37,34,54,12);

# Here we define D in terms of other primitive moves, saving on bytes
# Thanks @Lynn
# This is actually doable with a maximum of 3 of the primitive moves
# if a short enough sequence can be found.
D:=U^(R*L^3*F*F*B*B*R*L^3);

# create dictionary and add moves to it with appropriate char labels
d:=NewDictionary((),true);
AddDictionary(d,'R',R);
AddDictionary(d,'L',L);
AddDictionary(d,'U',U);
AddDictionary(d,'D',D);
AddDictionary(d,'F',F);
AddDictionary(d,'B',B);

f:=function(s)
    local c,p,t;

    # p will become the actual permutation passed to the function
    p:=();

    for c in s do
        if c='\'' then
            # The last generator we mutiplied (that we still have in t)
            # should have been its inverse. Compensate by preparing to
            # multiply it two more times to get t^3=t^-1. Thanks @Neil.
            t:=t^2;
        else
            t:=LookupDictionary(d,c);
        fi;
        p:=p*t;
    od;

    return Order(p);

end;

প্রতিটি পদক্ষেপ পরিচয়ের চতুর্থ মূল, সুতরাং আপনার বিপরীত অপ্রয়োজনীয়।
নীল

আপনি সম্ভবত আপনার অনুমতি 45দিয়ে প্রতিস্থাপন করতে পারেন 5, এবং তিনটি বাইট সংরক্ষণ করতে পারেন ।
লিন

1981 সালে সিংমাস্টারে পাওয়া বেনসনের একটি ফলাফল বলছে: "লেট এ = আরএলএফএব্রিলি, তারপরে এউএ = ডি" প্রকৃতপক্ষে, A:=R*L*L*L*F*F*B*B*R*L*L*L;D:=A*U*A;আপনার সংজ্ঞার চেয়ে সংক্ষিপ্ত D(তবে আমি এটি পরীক্ষা করতে পারি না ...)
লিন

^-1বিএডডাব্লু, জিএপি সত্যিই কি আপনাকে বিপরীতে লিখতে দেয় না ?
লিন

হ্যাঁ আমি সম্পূর্ণরূপে ^ -1 ব্যবহার করে ফাঁকা হয়েছি। যা আমি অনুমান করি ঠিক একই জিনিস @ নীল বলছিলেন, পরিবর্তে ^ 3 ছাড়া (যা আসলে সবচেয়ে সংক্ষিপ্ততম)। এছাড়াও, হ্যাঁ আমি অন্যান্য চলাচলগুলিতে চলনগুলি পচিয়ে দিতে পারি, এবং এটি করে আমার বেশ কয়েকটি বাইট সংরক্ষণ করতে সক্ষম হওয়া উচিত, এটি কেবল সংক্ষিপ্ত পচে যাওয়াটি সন্ধান করার বিষয় হবে।
লিয়াম

10

গণিত, 413 401 বাইট

Evaluate[f/@Characters@"RFLBUD"]=LetterNumber@"ABFEJNRMDAEHIMQPCDHGLPTOBCGFKOSNADCBILKJEFGHQRST"~ArrayReshape~{6,2,4};
r[c_,l_]:=(b=Permute[c,Cycles@f@l];MapThread[(b[[#,2]]=Mod[b[[#,2]]+{"F","B","L","R"}~Count~l{-1,1,-1,1},#2])&,{f@l,{3,2}}];b);
p@s_:=Length[c={#,0}&~Array~20;NestWhileList[Fold[r,#,Join@@StringCases[s,x_~~t:""|"'":>Table[x,3-2Boole[t==""]]]]&,c,(Length@{##}<2||c!=Last@{##})&,All]]-1

ব্যাখ্যা

একটি রুবিকের কিউবটি 20 অস্থাবর ঘনক্ষেত্র (8 কোণ, 12 প্রান্ত) দিয়ে তৈরি। প্রতিটি কিউবিকে একটি নম্বর দেওয়া যেতে পারে:

কোণ :

N   starting position
1     UFR
2     UBR
3     UBL
4     UFL
5     DFR
6     DBR
7     DBL
8     DFL

প্রান্তগুলি :

N   starting position
9     UF
10    UR
11    UB
12    UL
13    FR
14    BR
15    BL
16    FL
17    DF
18    DR
19    DB
20    DL

মনে রাখবেন যে কিউবটি মোচড় দেওয়া হয় তখন কিউবিগুলি সাধারণত আর তাদের আরম্ভের অবস্থানে থাকে না। উদাহরণস্বরূপ, যখন Rসম্পন্ন হয়, কিউবিটি একটি নতুন অবস্থানে 1চলে যায় ।UFRUBR

এই জাতীয় স্বরলিপিতে, 90 ডিগ্রি টার্নটি কিউবিকের 8 টি আন্দোলনের মাধ্যমে বর্ণনা করা যেতে পারে। উদাহরণস্বরূপ, Rদ্বারা বর্ণিত হয়

from  to
UFR   UBR
UBR   DBR
DBR   DFR
DFR   UFR
UR    BR
BR    DR
DR    FR
FR    UR

যেহেতু প্রতিটি কিউবির একটি অনন্য শুরুর অবস্থান রয়েছে তাই প্রতিটি পজিশনের এক অনন্য প্রারম্ভিক কিউবি রয়েছে। এর অর্থ , নিয়মটি UFR->UBRকেবলমাত্র 1->2(মানে Rকিউবিকে কিউবিকের প্রথম অবস্থানে কিউবির 1শুরুতে নিয়ে যায় 2)। সুতরাং, Rএকটি চক্র আরও সরলীকৃত করা যেতে পারে

Cycles[{{1,2,6,5}, {10,14,18,13}}]

কোনও রুবিকের কিউব সম্পূর্ণরূপে সমাধান করার জন্য, আমাদের কিউবিগুলি তাদের প্রারম্ভিক প্রবণতার সাথে প্রান্তিককরণ করতে হবে। কিউবের মুখগুলি বিভিন্ন রঙে আঁকা হয়, আমি কিউবগুলি সমাধান করার সময় প্রায়শই ব্যবহার করি

face color
U    yellow
D    white
F    red
B    orange
R    green
L    blue

যখন আমরা কোণগুলির ওরিয়েন্টেশন বিশ্লেষণ করি তখন হলুদ বা সাদা বাদে অন্য রঙগুলি উপেক্ষা করা হয় এবং হলুদ এবং সাদা একই রঙ হিসাবে বিবেচিত হয়।

ধরুন কিউবি 1তার শুরুতে রয়েছে UFR, হলুদ রঙটি তিনটি ভিন্ন মুখের সাথে সংযুক্ত করা যেতে পারে। আমরা এই ক্ষেত্রে প্রতিনিধিত্ব করতে একটি পূর্ণসংখ্যা ব্যবহার করি,

0  yellow on U  (correct)
1  yellow on R  (120 degree clockwise)
2  yellow on F  (120 degree counterclockwise)

ধরা যাক কিউবি 1চালু আছে DFL, এর তিনটি সম্ভাব্য ওরিয়েন্টেশন রয়েছে

0  yellow on D  (correct)
1  yellow on L  (120 degree clockwise)
2  yellow on F  (120 degree counterclockwise)

যখন আমরা প্রান্তগুলির ওরিয়েন্টেশনগুলি বিশ্লেষণ করি তখন লাল এবং কমলা উপেক্ষা করা হয় এবং কেবল প্রান্তটি যদি সবুজ বা নীল রূপ ধারণ করে তবে হলুদ এবং সাদা উপেক্ষা করা হয়।

ধরুন কিউবি 10তার শুরুতে রয়েছে UR, সবুজ মুখটি দুটি ভিন্ন মুখের সাথে সংযুক্ত থাকতে পারে। এটির সম্ভাব্য দুটি দিক

0  green on R  (correct)
1  green on U  (180 degree)

ধরুন কিউবি 10চালু আছে DF, এর দুটি সম্ভাব্য ওরিয়েন্টেশন রয়েছে

0  green on D  (correct)
1  green on F  (180 degree)

একটি ঘনক্ষেত্রের অবস্থা সঞ্চয় করতে একটি অ্যারে ব্যবহার করা হয়। একটি ঘনক্ষেত্রের শুরুর অবস্থা

{{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{9,0},{10,0},{11,0},{12,0},{13,0},{14,0},{15,0},{16,0},{17,0},{18,0},{19,0},{20,0}}

যার অর্থ হ'ল প্রতিটি ঘনক্ষেত্র সঠিক ওরিয়েন্টেশন সহ তাদের শুরুতে রয়েছে।

তারপরে Rকিউবের রাজ্য হয়

{{5,2},{1,1},{3,0},{4,0},{6,1},{2,2},{7,0},{8,0},{9,0},{13,1},{11,0},{12,0},{18,1},{10,1},{15,0},{16,0},{17,0},{14,1},{19,0},{20,0}}

যার অর্থ হ'ল কিউবিটি 5এখন ওরিয়েন্টেশনের সাথে অবস্থানে 1( UFR) রয়েছে 2, কিউবি 1এখন অবস্থানের সাথে রয়েছে 2( UBR) ওরিয়েন্টেশন সহ 1, কিউবি 3এখন অবস্থানের সাথে রয়েছে 3( UBL) ওরিয়েন্টেশন সহ 0এবং আরও কিছু।


পরীক্ষার মামলা

p["FF'"]            (* 1   *)
p["R"]              (* 4   *)
p["RUR'U'"]         (* 6   *)
p["LLUUFFUURRUU"]   (* 12  *)
p["LUFFRDRBF"]      (* 56  *)
p["LF"]             (* 105 *)
p["UFFR'DBBRL'"]    (* 120 *)
p["FRBL"]           (* 315 *)

7

হাস্কেল, 252 বাইট

r=[-2..2]
s=mapM id[r,r,r]
t m p@[x,y,z]=case m of"R"|x>0->[x,z,-y];"L"|x<0->[x,-z,y];"U"|y>0->[-z,y,x];"D"|y<0->[z,y,-x];"F"|z>0->[y,-x,z];"B"|z<0->[-y,x,z];c:"'"->t[c]$t[c]$t[c]p;_->p
f m=length$s:fst(span(/=s)$tail$iterate(flip(foldl$flip$map.t)m)s)

নমুনা রান:

*Main> f ["F","F'"]
1
*Main> f ["R"]
4
*Main> f ["R","U","R'","U'"]
6
*Main> f ["L","L","U","U","F","F","U","U","R","R","U","U"]
12
*Main> f ["L","U","F","F","R","D","R","B","F"]
56
*Main> f ["L","F"]
105
*Main> f ["U","F","F","R'","D","B","B","R","L'"]
120
*Main> f ["F","R","B","L"]
315
*Main> f ["R","U","U","D'","B","D'"]  -- maximum possible order
1260

এখানে মূল পর্যবেক্ষণটি হ'ল রুবিক কিউবকে ওরিয়েন্টেড কিউবিকের 3 × 3 × 3 গ্রিডের পরিবর্তে 5 × 5 × 5 পয়েন্টের গ্রিড হিসাবে মডেল করা সহজ। কোণার কিউবিগুলি 2 × 2 × 2 পয়েন্টের কিউব হয়, প্রান্ত কিউবিগুলি 2 × 2 × 1 পয়েন্টের স্কোয়ারে পরিণত হয় এবং 5 × 5 × 2 পয়েন্টের ঘোরানো টুকরাগুলিকে সরায়।


আসলেই চালাক! আমি প্রতিস্থাপন মনে c:"'"সঙ্গে c:_দুই বাইট পরিমাণ সঞ্চয় হয়।
লিন

ধন্যবাদ! আমি পরীক্ষার
কেসগুলির

@ লিন, এটি কাজ করে না কারণ _খালি তালিকার সাথেও মেলে।
অ্যান্ডারস ক্যাসরগ

এটি দুর্দান্ত, তবে এটি অন্য প্রশ্নের কোডগলফ.স্ট্যাকেক্সেঞ্জাওনএ / এ / 7৪775//১5৫৯৯ এর উত্তরটির সাথে খুব মিল বলে মনে হচ্ছে । আপনি যদি এটি দ্বারা অনুপ্রাণিত হন তবে আপনার এটি স্বীকার করা উচিত।
স্তর নদী সেন্ট

@ স্টিভেরিল, বাহ, এটি চিত্তাকর্ষকভাবে অনুরূপ দেখায়, তবে না, আমি এটি দেখিনি। আমার উত্তর আমার নিজস্ব কাজ। (অবশ্যই, আমি স্বীকার করি যে জেন
ডভোরাক

7

রুবি, 225 বাইট

->s{n=0
a=[]
b=[]
64.times{|i|a<<j=[(i&48)-16,(i&12)-4,i%4-1];b<<j*1}
d=1
(n+=1
s.reverse.chars{|c|m="UFRDBL".index(c)
m ?(e=m/3*2-1
b.each{|j|j[m%=3]*e>0&&(j[m-2],j[m-1]=j[m-1]*e*d,-j[m-2]*e*d)}
d=1):d=-1})until n>0&&a==b
n}

অ্যান্ডারস ক্যাসরগের উত্তরের মতো এবং জ্যান ডিভোরাকের দ্বারা অনুপ্রাণিত উত্তর পূর্ববর্তী প্রশ্নের।

তবে এই উত্তরগুলির মতো নয়, আমার 125 ঘনক্ষেত্রের দরকার নেই। আমি একটি রুবিকের ঘনক্ষেত্র 27 কিউবি ব্যবহার করি তবে আয়তক্ষেত্রাকার মাত্রা। সমাধান হওয়া অবস্থায় কোণে রয়েছে +/-1,+/-4,+/-16

আমি cub৪ কিউবির একটি অ্যারে জেনারেট করে থাকি, প্রতিটি কেন্দ্র থেকে বেছে নেওয়া হয় x=[-1,0,1,2], y=[-4,0,4,8], z=[-16-0,16,32] । 2, 8 এবং 32 এর স্থানাঙ্কযুক্ত কিউবিগুলি অপ্রয়োজনীয় তবে এগুলি কোনও ক্ষতি করে না, তাই তারা গল্ফের কারণে ছেড়ে যায়। কিউবসের দৈর্ঘ্য, প্রস্থ এবং গভীরতাটি পৃথক: (1,4,16) এর অর্থ তারা সঠিক জায়গায় থাকলেও ভুল দিকনির্দেশের সাথে সনাক্ত করা সহজ।

প্রতিটি ঘনক্ষেত্রটি ফেসথর্ণগুলি দ্বারা সরানো হিসাবে ট্র্যাক করা হয়। মুখের সাথে অক্ষরেখার ঘনক্ষেত্রের সমন্বয় যদি ( e=-1ইউ, এফ, আর বা e=1ডি, বি, এল এর জন্য গুণিত হয় ) তবে স্থানাঙ্কগুলি অন্য 2 অক্ষের মধ্যে অদলবদল করে এবং এটি প্রয়োগ করে ঘোরানো হবে স্থানাঙ্কগুলির মধ্যে একটিতে উপযুক্ত সাইন পরিবর্তন। এটি দ্বারা গুণিত দ্বারা নিয়ন্ত্রিত হয় e*d

ইনপুট ক্রমটি বিপরীত ক্রমে স্ক্যান করা হয়। এটি কোনও তত্পরতা রাখে না, যতক্ষণ না "সাধারণ" রোটেশনগুলি ঘড়ির কাঁটার পরিবর্তে অ্যান্টিক্লোকের দিকে সঞ্চালিত হয়। এর কারণটি হ'ল যদি কোনও 'প্রতীক পাওয়া যায় dতবে নিম্নলিখিত মুখটিকে বিপরীত দিকে ঘোরানোর জন্য মানটি 1 থেকে -1 এ পরিবর্তন করা যায়।

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ

f=->s{n=0                                      #number of repeats=0
  a=[]                                         #empty array for solved position
  b=[]                                         #empty array for current position
  64.times{|i|
    a<<j=[(i&48)-16,(i&12)-4,i%4-1]            #generate 64 cubies and append them to the solved array
    b<<j*1                                     #duplicate them and append to active array
  }
  d=1                                          #default rotation direction anticlockwise (we scan the moves in reverse)                              
  (                                            #start of UNTIL loop
    n+=1                                       #increment repeat counter
    s.reverse.chars{|c|                        #reverse list of moves and iterate through it
      m="UFRDBL".index(c)                      #assign move letter to m (for ' or any other symbol m is false)
      m ?                                      #if a letter
        (e=m/3*2-1                             #e=-1 for UFR, 1 for DBL
        b.each{|j|                             #for each cubie 
          j[m%=3]*e>0&&                        #m%=3 picks an axis. If the cubie is on the moving face of the cube
         (j[m-2],j[m-1]=j[m-1]*e*d,-j[m-2]*e*d)#rotate it: exchange the coordinates in the other 2 axes and invert the sign of one of them according to direction
        }                                      #as per the values of e and d. 
        d=1                                    #set d=1 (in case it was -1 at the start of the b.each loop)
      ):
      d=-1                                     #ELSE the input must be a ', so set d=-1 to reverse rotation of next letter
    }
   )until n>0&&a==b                            #end of UNTIL loop. continue until back at start position a==b
n}                                             #return n

p f["FF'"]               #      1
p f["R"]                 #      4
p f["RUR'U'"]            #      6
p f["LLUUFFUURRUU"]      #     12
p f["LUFFRDRBF"]         #     56
p f["LF"]                #    105
p f["UFFR'DBBRL'"]       #    120
p f["FRBL"]              #    315

7

পাইথন 2, 343 বাইট

def M(o,v,e):
 k=1
 for m in e:
  for c in'ouf|/[bPcU`Dkqbx-Y:(+=P4cyrh=I;-(:R6'[m::6]:i=~ord(c)%8*k;j=(ord(c)/8-4)*k;o[i],o[j]=o[j]-m/2,o[i]+m/2;v[i],v[j]=v[j],v[i];k=-k
V=range(20)
o,v,e=[0]*20,V[:],[]
for c in raw_input():i='FBRLUD'.find(c);e+=i<0and e[-1:]*2or[i]
M(o,v,e);n=1
while any(o[i]%(2+i/12)for i in V)or v>V:M(o,v,e);n+=1
print n

স্ট্যান্ডিন থেকে ইনপুট নেওয়া হয়।

টুইস্টের প্রদত্ত ক্রমটি ভার্চুয়াল কিউবে বারবার সঞ্চালিত হয় যতক্ষণ না এটি সমাধান হওয়া অবস্থায় ফিরে আসে। কিউব রাজ্যটি উভয় দৈর্ঘ্যের উভয় দৈর্ঘ্যের একটি ওরিয়েন্টেশন ভেক্টর এবং অনুক্রম ভেক্টর হিসাবে সংরক্ষণ করা হয়।

ওরিয়েন্টেশন কিছুটা নির্বিচারে সংজ্ঞায়িত করা হয়: একটি এজ কিউবি সঠিকভাবে ওরিয়েন্টেড যদি এটি কোনও আর বা এল কোয়ার্টারের টার্ন না করে জায়গায় স্থানান্তরিত করা যায়। কোণার ঘনক্ষেত্রের অবস্থানটি এফ এবং বি মুখগুলির সাথে সম্পর্কিত বলে মনে করা হয়।


নমুনা ব্যবহার

$ echo FRBL|python rubiks-cycle.py
315

$ echo RULURFLF|python rubiks-cycle.py
1260

অনলাইন বিক্ষোভ এবং পরীক্ষার স্যুট


3
ফাংশনের নাম এবং যুক্তিগুলির দুর্দান্ত পছন্দ!
নিল

3

ক্লোজার, 359 বাইট

এটি আমার দ্বিতীয় দীর্ঘতম কোডগল্ফ হতে পারে। বুঝতে পেরে আমি ভেক্টর থেকে শূন্য trailing ড্রপ পারে Aথেকে Fআমাকে বড্ড আনন্দিত করেছে: ডি

#(let[I(clojure.string/replace % #"(.)'""$1$1$1")D(range -2 3)S(for[x D y D z D][x y z])A[0 1]B[0 0 1]C[1]D[-1]E[0 -1]F[0 0 -1]](loop[P S[[n R]& Q](cycle(map{\F[A[B A D]]\B[E[F A C]]\L[D[C B E]]\R[C[C F A]]\U[B[E C B]]\D[F[A D B]]}I))c 0](if(=(> c 0)(= P S))(/ c(count I))(recur(for[p P](if(>(apply +(map * n p))0)(for[r R](apply +(map * r p)))p))Q(inc c)))))

কম গল্ফড:

(def f #(let [I (clojure.string/replace % #"(.)'""$1$1$1")
              D [-2 -1 0 1 2]
              S (for[x D y D z D][x y z])
              L   {\F [[ 0  1  0][[0  0  1][ 0 1  0][-1  0 0]]]
                   \B [[ 0 -1  0][[0  0 -1][ 0 1  0][ 1  0 0]]]
                   \L [[-1  0  0][[1  0  0][ 0 0  1][ 0 -1 0]]]
                   \R [[ 1  0  0][[1  0  0][ 0 0 -1][ 0  1 0]]]
                   \U [[ 0  0  1][[0 -1  0][ 1 0  0][ 0  0 1]]]
                   \D [[ 0  0 -1][[0  1  0][-1 0  0][ 0  0 1]]]}]
          (loop [P S c 0 [[n R] & Q] (cycle(map L I))]
            (if (and (> c 0) (= P S))
              (/ c (count I))
              (recur (for[p P](if(pos?(apply +(map * n p)))
                                (for[r R](apply +(map * r p)))
                                p))
                     (inc c)
                     Q)))))

এটি কেবল 5 x 5 x 5কিউবের নির্বাচিত সাবসেটগুলির 3 ডি ঘূর্ণন প্রয়োগ করে । মূলত আমি ব্যবহার করতে যাচ্ছিলাম 3 x 3 x 3এবং কেন আমি সঠিক ফলাফল পাচ্ছি না তা বুঝতে আমার কিছুটা সময় লেগেছিল। ভাল পরীক্ষার মামলা! "RUR'U'"হিসাবে মুষ্টি এনকোডিংয়ের জন্য কিছু অতিরিক্ত বাইট "RURRRUUU"


3

কিউবিকভাবে , 9 6 বাইট

¶-7)8%

এটি অনলাইন চেষ্টা করুন! (ডেনিস টিআইও কিউবিক্যাল ইন্টারপ্রেটার আপডেট না হওয়া পর্যন্ত অজয়িং)

ব্যাখ্যা:

¶-7)8%
¶       read a string, insert into code
 -7     add 1 to notepad (subtracts the 7th face "sum" from notepad, defaulted to -1)
   )8   jump back to start of code if cube unsolved
     %  print notepad

এই ভাষাটি সমস্ত চ্যালেঞ্জগুলিকে আধিপত্য করবে >: ডি


3
এই সমস্ত নতুন ফ্যাংলড এসোলেংস। আমার দিনে ফিরে, -7সাতটি বিয়োগ করে একটিতে ক্রোধে
হাঁটা দেয় না

পছন্দ করুন : পি তার চারপাশে কিছু ব্যাখ্যা যুক্ত করেছেন।
এমডি এক্সএফ

1

পরিষ্কার , 255 বাইট

এই প্রশ্নের উত্তর হিসাবে প্রায়-অভিন্ন হাস্কেল উত্তর থেকে পৃথকভাবে প্রাপ্ত, যা প্রায় শেষ হয়ে যাওয়ার পরে ডুপ্লিকেট হিসাবে বন্ধ ছিল, তাই আমি উত্তরটি এখানে পোস্ট করেছি।

import StdEnv,StdLib
a=[-2..2];b=diag3 a a a
?m=iter(size m*2-1)\p=:(x,y,z)=case m.[0]of'F'|z>0=(y,~x,z);'U'|y>0=(~z,y,x);'R'|x>0=(x,z,~y);'B'|z<0=(~y,x,z);'D'|y<0=(z,y,~x);'L'|x<0=(x,~z,y);_=p
$l=length(takeWhile((<>)b)(tl(iterate(map(sseq(map?l)))b)))+1

এটি অনলাইন চেষ্টা করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.