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"); } }
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)); } }
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)); } }
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)); } }
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(); } }