示例#1
0
            public static void VerifyOpCountForAccelerationMap()
            {
                CubeState state = new CubeState();

                CubeAction actionNoAcc = CubeAction.Random(CubeAction.OpCountForAccelerationMap - 1);
                CubeAction actionAcc   = CubeAction.Random(CubeAction.OpCountForAccelerationMap);

                Console.WriteLine(
                    "Expecting timeNoAcc is similar to timeAcc, " +
                    "otherwise adjust CubeAction.OpCountForAccelerationMap");

                for (int i = 0; i < 5; i++)
                {
                    long timeStart = Utils.CurrentTimeMillis();

                    for (int j = 0; j < 500; j++)
                    {
                        actionNoAcc.Act(state);
                    }
                    long timeNoAcc = Utils.CurrentTimeMillis();

                    for (int j = 0; j < 500; j++)
                    {
                        actionAcc.Act(state);
                    }
                    long timeAcc = Utils.CurrentTimeMillis();

                    Console.WriteLine($"timeNoAcc={timeNoAcc - timeStart}ms, timeAcc={timeAcc - timeNoAcc}ms");
                }
            }
示例#2
0
            public static void VerifyGroupActionAssociaty()
            {
                for (int caseIdx = 0; caseIdx < 100; caseIdx++)
                {
                    CubeAction a = CubeAction.Random(Utils.GlobalRandom.Next(1, 20));
                    CubeAction b = CubeAction.Random(Utils.GlobalRandom.Next(1, 15));
                    CubeAction c = CubeAction.Random(Utils.GlobalRandom.Next(1, 10));

                    CubeAction ab = a.Mul(b);
                    CubeAction bc = b.Mul(c);

                    CubeState origState = CubeAction.RandomCube(Utils.GlobalRandom.Next(1, 20));

                    CubeState a_b_c_state = new CubeState(origState);
                    c.Act(a_b_c_state);
                    b.Act(a_b_c_state);
                    a.Act(a_b_c_state);

                    CubeState ab_c_state = new CubeState(origState);
                    c.Act(ab_c_state);
                    ab.Act(ab_c_state);

                    CubeState a_bc_state = new CubeState(origState);
                    bc.Act(a_bc_state);
                    a.Act(a_bc_state);

                    Utils.DebugAssert(a_b_c_state.Equals(ab_c_state));
                    Utils.DebugAssert(a_b_c_state.Equals(a_bc_state));
                }
            }
示例#3
0
            public static void VerifyIdentity()
            {
                for (int caseIdx = 0; caseIdx < 100; caseIdx++)
                {
                    CubeAction a  = CubeAction.Random(Utils.GlobalRandom.Next(1, 10));
                    CubeAction id = new CubeAction();

                    CubeAction aid = a.Mul(id);
                    CubeAction ida = id.Mul(a);

                    Utils.DebugAssert(a.Equals(aid));
                    Utils.DebugAssert(a.Equals(ida));
                }
            }
示例#4
0
            public static void VerifyReverse()
            {
                for (int caseIdx = 0; caseIdx < 100; caseIdx++)
                {
                    CubeAction a  = CubeAction.Random(Utils.GlobalRandom.Next(1, 20));
                    CubeAction ra = a.Reverse();
                    CubeAction id = new CubeAction();

                    CubeAction ara = a.Mul(ra);
                    CubeAction raa = ra.Mul(a);

                    Utils.DebugAssert(id.Equals(ara));
                    Utils.DebugAssert(id.Equals(raa));
                }
            }
示例#5
0
            public static void VerifyAssociaty()
            {
                for (int caseIdx = 0; caseIdx < 100; caseIdx++)
                {
                    CubeAction a = CubeAction.Random(Utils.GlobalRandom.Next(1, 10));
                    CubeAction b = CubeAction.Random(Utils.GlobalRandom.Next(1, 15));
                    CubeAction c = CubeAction.Random(Utils.GlobalRandom.Next(1, 20));

                    CubeAction ab_c = a.Mul(b).Mul(c);
                    CubeAction a_bc = a.Mul(b.Mul(c));

                    Utils.DebugAssert(ab_c.Equals(a_bc));
                    Utils.DebugAssert(a_bc.Equals(ab_c));
                }
            }
        static void Main(string[] args)
        {
            string CONSOLE_OUTPUT_FILE = "console.out.txt";

            using (var fileWriter = new StreamWriter(File.Create(CONSOLE_OUTPUT_FILE)))
            {
                //
                // Setup
                //

                fileWriter.AutoFlush = true;

                var consoleMirrorFile = new Utils.MirroredWriter(fileWriter, Console.Out);
                Console.SetOut(consoleMirrorFile);

                //
                // Verifying basics
                //

                GroupTests.VerifyAll();

                //
                // Calculating the map to solve Rubik's Cube
                //

                CubeSolution cs = new CubeSolution();
                cs.SolveCosetMap();

                Console.Out.Flush();

                //
                // Dump the solved coset map of the cube
                //

                cs.DumpGSteps();
                Console.Out.Flush();

                //
                // Solve a Rubik's Cube
                //

                const int SETUP_ACTION_LENGTH_LIMIT = 1000;
                const int CASE_COUNT = 2;

                for (int caseIdx = 0; caseIdx < CASE_COUNT; caseIdx++)
                {
                    var setupAction = CubeAction.Random(
                        Utils.GlobalRandom.Next(SETUP_ACTION_LENGTH_LIMIT));
                    Console.WriteLine(
                        $"SolvingCube[case={caseIdx}]: " +
                        $"setupAction=[Size={setupAction.Count()}, Action=[{setupAction}]]");

                    CubeState setupState = new CubeState();
                    setupAction.Act(setupState);

                    CubeState solvingState = new CubeState(setupState);
                    var       steps        = cs.SolveCube(solvingState);

                    int stepIdx = 0;
                    foreach (var step in steps)
                    {
                        string actionStr = step.Item1.ToStringWithFormula();

                        Console.WriteLine(
                            $"SolvingCube[case={caseIdx}]: stepIdx={stepIdx} " +
                            $"stepAction=[Size={step.Item1.Count()}, Action=[{actionStr}]] " +
                            $"cubeState=[");
                        Console.WriteLine($"{step.Item2}]");

                        stepIdx++;
                    }

                    Console.Out.Flush();
                }

                //
                // Simplify the generate cosets
                //

                cs.SimplifyCosets();
                Console.Out.Flush();
            }
        }