Skip to content

Commit

Permalink
refactor: filter & add no xyz filter
Browse files Browse the repository at this point in the history
  • Loading branch information
twd2 committed Dec 24, 2015
1 parent 5dd030a commit 8145f13
Show file tree
Hide file tree
Showing 15 changed files with 332 additions and 29 deletions.
25 changes: 18 additions & 7 deletions MagicCube/CommandHandlers.cpp
Expand Up @@ -17,9 +17,13 @@ void solveHandler(string value)
{
CubeSolver *solver = (CubeSolver*)new GeneralSolver(cube);
solver->Solve();
printf("Steps: %s\n", stepsToString(solver->Step).c_str());
printf("Steps(%llu): %s\n", solver->Step.size(), stepsToString(solver->Step).c_str());
CubeSteps steps = ReduceFilter::Filter(solver->Step);
printf("Reduced steps: %s\n", stepsToString(steps).c_str());
printf("Reduced steps(%llu): %s\n", steps.size(), stepsToString(steps).c_str());
steps = NoXYZFilter::Filter(steps);
printf("No XYZ steps(%llu): %s\n", steps.size(), stepsToString(steps).c_str());
steps = ReduceFilter::Filter(steps);
printf("Reduced again steps(%llu): %s\n", steps.size(), stepsToString(steps).c_str());
delete solver;
}

Expand All @@ -28,11 +32,15 @@ void playHandler(string value)
Cube oldCube = cube;
CubeSolver *solver = (CubeSolver*)new GeneralSolver(cube);
solver->Solve();
printf("Steps: %s\n", stepsToString(solver->Step).c_str());
printf("Steps(%llu): %s\n", solver->Step.size(), stepsToString(solver->Step).c_str());
CubeSteps steps = ReduceFilter::Filter(solver->Step);
printf("Reduced steps(%llu): %s\n", steps.size(), stepsToString(steps).c_str());
steps = NoXYZFilter::Filter(steps);
printf("No XYZ steps(%llu): %s\n", steps.size(), stepsToString(steps).c_str());
steps = ReduceFilter::Filter(steps);
printf("Reduced again steps(%llu): %s\n", steps.size(), stepsToString(steps).c_str());
delete solver;
cube = oldCube;
printf("Reduced steps: %s\n", stepsToString(steps).c_str());
play(steps);
}

Expand Down Expand Up @@ -103,7 +111,7 @@ void testHandler(string value)
++count;
if (count % 10000 == 0)
{
printf("%lld\n", count);
printf("%llu\n", count);
}

Cube cube1, cube2;
Expand All @@ -121,20 +129,23 @@ void testHandler(string value)
{
solver->Solve();
CubeSteps steps = solver->Step;
steps = ReduceFilter::Filter(steps);
steps = NoXYZFilter::Filter(steps);
steps = ReduceFilter::Filter(steps);
for (auto step : steps)
{
cube2.DoMethod(step);
}
}
catch (const SolverError &err)
{
printf("ERROR %s %s\n", err.what.c_str(), cube.Save().c_str());
printf("ERROR %s %s\n", err.what.c_str(), cube1.Save().c_str());
}
delete solver;

if (!cube2.Check())
{
printf("FAIL %s\n", cube.Save().c_str());
printf("FAIL %s\n", cube1.Save().c_str());
}
}
}
Expand Down
1 change: 1 addition & 0 deletions MagicCube/CommandHandlers.h 100644 → 100755
Expand Up @@ -3,6 +3,7 @@
#include "utilities.h"
#include "Cube.h"
#include "Input.h"
#include "NoXYZFilter.h"

#ifdef USE_GL

Expand Down
2 changes: 1 addition & 1 deletion MagicCube/Config.h 100644 → 100755
Expand Up @@ -7,4 +7,4 @@
#define USE_GL
#endif

#define NO_VERTICES_BUFFER //TODO: fix vertices buffer
#define NO_VERTICES_BUFFER // TODO: fix vertices buffer
27 changes: 12 additions & 15 deletions MagicCube/MagicCube.cpp
Expand Up @@ -72,28 +72,25 @@ void textMode(int argc, char *argv[])
cube.Load(data);
CubeSolver *solver = (CubeSolver*)new GeneralSolver(cube);
solver->Solve();
auto steps = StepReduce::Reduce(solver->Step);
auto steps = ReduceFilter::Filter(solver->Step);
steps = NoXYZFilter::Filter(steps);
steps = ReduceFilter::Filter(steps);
delete solver;
printf("%s\n", stepsToString(steps).c_str());
}
#endif //USE_GL

void test()
{
Cube a, b;
a.DoMethod(ROTATE_WHOLEY);
a.DoMethod(ROTATE_FRONT);
a.DoMethod(ROTATE_WHOLEYi);
b.DoMethod(ROTATE_RIGHT);
printf("test1: %d\n", a == b);


if (steps.size() > 0)
{
printf("%s\n", stepsToString(steps).c_str());
}
else
{
printf("Nothing to do.\n");
}
}
#endif //USE_GL

int main(int argc, char *argv[])
{
srand(clock());
test();
#ifdef USE_GL
graphicMode(argc, argv);
#else
Expand Down
1 change: 1 addition & 0 deletions MagicCube/MagicCube.h
Expand Up @@ -5,6 +5,7 @@
#include "CubeSolver.h"
#include "GeneralSolver.h"
#include "ReduceFilter.h"
#include "NoXYZFilter.h"

#ifdef USE_GL
#include "CommandHandlers.h"
Expand Down
2 changes: 2 additions & 0 deletions MagicCube/MagicCube.vcxproj
Expand Up @@ -245,6 +245,7 @@
<ClInclude Include="include\GL\wglew.h" />
<ClInclude Include="Input.h" />
<ClInclude Include="MagicCube.h" />
<ClInclude Include="NoXYZFilter.h" />
<ClInclude Include="RandomSolver.h" />
<ClInclude Include="Rendering.h" />
<ClInclude Include="RotationAnimation.h" />
Expand All @@ -267,6 +268,7 @@
<ClCompile Include="Graphics.cpp" />
<ClCompile Include="Input.cpp" />
<ClCompile Include="MagicCube.cpp" />
<ClCompile Include="NoXYZFilter.cpp" />
<ClCompile Include="RandomSolver.cpp" />
<ClCompile Include="Rendering.cpp" />
<ClCompile Include="RotationAnimation.cpp" />
Expand Down
6 changes: 6 additions & 0 deletions MagicCube/MagicCube.vcxproj.filters
Expand Up @@ -90,6 +90,9 @@
<ClInclude Include="ReduceFilter.h">
<Filter>Headers</Filter>
</ClInclude>
<ClInclude Include="NoXYZFilter.h">
<Filter>Headers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
Expand Down Expand Up @@ -149,5 +152,8 @@
<ClCompile Include="ReduceFilter.cpp">
<Filter>Sources</Filter>
</ClCompile>
<ClCompile Include="NoXYZFilter.cpp">
<Filter>Sources</Filter>
</ClCompile>
</ItemGroup>
</Project>
226 changes: 226 additions & 0 deletions MagicCube/NoXYZFilter.cpp
@@ -0,0 +1,226 @@
#include "stdafx.h"
#include "NoXYZFilter.h"

map<CubeRotateMethod, map<CubeRotateMethod, CubeRotateMethod> > XYZMapTables =
{
{ ROTATE_NONE, {
{ ROTATE_NONE, ROTATE_NONE },
{ ROTATE_FRONT, ROTATE_FRONT },
{ ROTATE_BACK, ROTATE_BACK },
{ ROTATE_LEFT, ROTATE_LEFT },
{ ROTATE_RIGHT, ROTATE_RIGHT },
{ ROTATE_UP, ROTATE_UP },
{ ROTATE_DOWN, ROTATE_DOWN },
{ ROTATE_WHOLEX, ROTATE_WHOLEX },
{ ROTATE_WHOLEY, ROTATE_WHOLEY },
{ ROTATE_WHOLEZ, ROTATE_WHOLEZ },
{ ROTATE_NONEi, ROTATE_NONE },
{ ROTATE_FRONTi, ROTATE_FRONTi },
{ ROTATE_BACKi, ROTATE_BACKi },
{ ROTATE_LEFTi, ROTATE_LEFTi },
{ ROTATE_RIGHTi, ROTATE_RIGHTi },
{ ROTATE_UPi, ROTATE_UPi },
{ ROTATE_DOWNi, ROTATE_DOWNi },
{ ROTATE_WHOLEXi, ROTATE_WHOLEXi },
{ ROTATE_WHOLEYi, ROTATE_WHOLEYi },
{ ROTATE_WHOLEZi, ROTATE_WHOLEZi }
} },
{ ROTATE_WHOLEX, {
{ ROTATE_NONE, ROTATE_NONE },
{ ROTATE_FRONT, ROTATE_DOWN },
{ ROTATE_BACK, ROTATE_UP },
{ ROTATE_LEFT, ROTATE_LEFT },
{ ROTATE_RIGHT, ROTATE_RIGHT },
{ ROTATE_UP, ROTATE_FRONT },
{ ROTATE_DOWN, ROTATE_BACK },
{ ROTATE_WHOLEX, ROTATE_WHOLEX },
{ ROTATE_WHOLEY, ROTATE_WHOLEZ },
{ ROTATE_WHOLEZ, ROTATE_WHOLEYi },
{ ROTATE_NONEi, ROTATE_NONE },
{ ROTATE_FRONTi, ROTATE_DOWNi },
{ ROTATE_BACKi, ROTATE_UPi },
{ ROTATE_LEFTi, ROTATE_LEFTi },
{ ROTATE_RIGHTi, ROTATE_RIGHTi },
{ ROTATE_UPi, ROTATE_FRONTi },
{ ROTATE_DOWNi, ROTATE_BACKi },
{ ROTATE_WHOLEXi, ROTATE_WHOLEXi },
{ ROTATE_WHOLEYi, ROTATE_WHOLEZi },
{ ROTATE_WHOLEZi, ROTATE_WHOLEY }
} },
{ ROTATE_WHOLEY, {
{ ROTATE_NONE, ROTATE_NONE },
{ ROTATE_FRONT, ROTATE_RIGHT },
{ ROTATE_BACK, ROTATE_LEFT },
{ ROTATE_LEFT, ROTATE_FRONT },
{ ROTATE_RIGHT, ROTATE_BACK },
{ ROTATE_UP, ROTATE_UP },
{ ROTATE_DOWN, ROTATE_DOWN },
{ ROTATE_WHOLEX, ROTATE_WHOLEZi },
{ ROTATE_WHOLEY, ROTATE_WHOLEY },
{ ROTATE_WHOLEZ, ROTATE_WHOLEX },
{ ROTATE_NONEi, ROTATE_NONE },
{ ROTATE_FRONTi, ROTATE_RIGHTi },
{ ROTATE_BACKi, ROTATE_LEFTi },
{ ROTATE_LEFTi, ROTATE_FRONTi },
{ ROTATE_RIGHTi, ROTATE_BACKi },
{ ROTATE_UPi, ROTATE_UPi },
{ ROTATE_DOWNi, ROTATE_DOWNi },
{ ROTATE_WHOLEXi, ROTATE_WHOLEZ },
{ ROTATE_WHOLEYi, ROTATE_WHOLEYi },
{ ROTATE_WHOLEZi, ROTATE_WHOLEXi }
} },
{ ROTATE_WHOLEZ, {
{ ROTATE_NONE, ROTATE_NONE },
{ ROTATE_FRONT, ROTATE_FRONT },
{ ROTATE_BACK, ROTATE_BACK },
{ ROTATE_LEFT, ROTATE_DOWN },
{ ROTATE_RIGHT, ROTATE_UP },
{ ROTATE_UP, ROTATE_LEFT },
{ ROTATE_DOWN, ROTATE_RIGHT },
{ ROTATE_WHOLEX, ROTATE_WHOLEY },
{ ROTATE_WHOLEY, ROTATE_WHOLEXi },
{ ROTATE_WHOLEZ, ROTATE_WHOLEZ },
{ ROTATE_NONEi, ROTATE_NONE },
{ ROTATE_FRONTi, ROTATE_FRONTi },
{ ROTATE_BACKi, ROTATE_BACKi },
{ ROTATE_LEFTi, ROTATE_DOWNi },
{ ROTATE_RIGHTi, ROTATE_UPi },
{ ROTATE_UPi, ROTATE_LEFTi },
{ ROTATE_DOWNi, ROTATE_RIGHTi },
{ ROTATE_WHOLEXi, ROTATE_WHOLEYi },
{ ROTATE_WHOLEYi, ROTATE_WHOLEX },
{ ROTATE_WHOLEZi, ROTATE_WHOLEZi }
} },
{ ROTATE_WHOLEXi, {
{ ROTATE_NONE, ROTATE_NONE },
{ ROTATE_FRONT, ROTATE_UP },
{ ROTATE_BACK, ROTATE_DOWN },
{ ROTATE_LEFT, ROTATE_LEFT },
{ ROTATE_RIGHT, ROTATE_RIGHT },
{ ROTATE_UP, ROTATE_BACK },
{ ROTATE_DOWN, ROTATE_FRONT },
{ ROTATE_WHOLEX, ROTATE_WHOLEX },
{ ROTATE_WHOLEY, ROTATE_WHOLEZi },
{ ROTATE_WHOLEZ, ROTATE_WHOLEY },
{ ROTATE_NONEi, ROTATE_NONE },
{ ROTATE_FRONTi, ROTATE_UPi },
{ ROTATE_BACKi, ROTATE_DOWNi },
{ ROTATE_LEFTi, ROTATE_LEFTi },
{ ROTATE_RIGHTi, ROTATE_RIGHTi },
{ ROTATE_UPi, ROTATE_BACKi },
{ ROTATE_DOWNi, ROTATE_FRONTi },
{ ROTATE_WHOLEXi, ROTATE_WHOLEXi },
{ ROTATE_WHOLEYi, ROTATE_WHOLEZ },
{ ROTATE_WHOLEZi, ROTATE_WHOLEYi }
} },
{ ROTATE_WHOLEYi, {
{ ROTATE_NONE, ROTATE_NONE },
{ ROTATE_FRONT, ROTATE_LEFT },
{ ROTATE_BACK, ROTATE_RIGHT },
{ ROTATE_LEFT, ROTATE_BACK },
{ ROTATE_RIGHT, ROTATE_FRONT },
{ ROTATE_UP, ROTATE_UP },
{ ROTATE_DOWN, ROTATE_DOWN },
{ ROTATE_WHOLEX, ROTATE_WHOLEZ },
{ ROTATE_WHOLEY, ROTATE_WHOLEY },
{ ROTATE_WHOLEZ, ROTATE_WHOLEXi },
{ ROTATE_NONEi, ROTATE_NONE },
{ ROTATE_FRONTi, ROTATE_LEFTi },
{ ROTATE_BACKi, ROTATE_RIGHTi },
{ ROTATE_LEFTi, ROTATE_BACKi },
{ ROTATE_RIGHTi, ROTATE_FRONTi },
{ ROTATE_UPi, ROTATE_UPi },
{ ROTATE_DOWNi, ROTATE_DOWNi },
{ ROTATE_WHOLEXi, ROTATE_WHOLEZi },
{ ROTATE_WHOLEYi, ROTATE_WHOLEYi },
{ ROTATE_WHOLEZi, ROTATE_WHOLEX }
} },
{ ROTATE_WHOLEZi, {
{ ROTATE_NONE, ROTATE_NONE },
{ ROTATE_FRONT, ROTATE_FRONT },
{ ROTATE_BACK, ROTATE_BACK },
{ ROTATE_LEFT, ROTATE_UP },
{ ROTATE_RIGHT, ROTATE_DOWN },
{ ROTATE_UP, ROTATE_RIGHT },
{ ROTATE_DOWN, ROTATE_LEFT },
{ ROTATE_WHOLEX, ROTATE_WHOLEYi },
{ ROTATE_WHOLEY, ROTATE_WHOLEX },
{ ROTATE_WHOLEZ, ROTATE_WHOLEZ },
{ ROTATE_NONEi, ROTATE_NONE },
{ ROTATE_FRONTi, ROTATE_FRONTi },
{ ROTATE_BACKi, ROTATE_BACKi },
{ ROTATE_LEFTi, ROTATE_UPi },
{ ROTATE_RIGHTi, ROTATE_DOWNi },
{ ROTATE_UPi, ROTATE_RIGHTi },
{ ROTATE_DOWNi, ROTATE_LEFTi },
{ ROTATE_WHOLEXi, ROTATE_WHOLEY },
{ ROTATE_WHOLEYi, ROTATE_WHOLEXi },
{ ROTATE_WHOLEZi, ROTATE_WHOLEZi }
} }
};

// above tables is generated by following code
/*for (CubeRotateMethod wholeMethod = ROTATE_NONE; wholeMethod <= ROTATE_WHOLEZi; wholeMethod = (CubeRotateMethod)((int)wholeMethod + 1))
{
if (!(wholeMethod == ROTATE_NONE || isWholeRotate(wholeMethod)))
{
continue;
}
printf("{ %s, {\n", CubeRotateMethodEnumName[wholeMethod].c_str());
for (CubeRotateMethod src = ROTATE_NONE; src <= ROTATE_WHOLEZi; src = (CubeRotateMethod)((int)src + 1))
{
for (CubeRotateMethod des = ROTATE_NONE; des <= ROTATE_WHOLEZi; des = (CubeRotateMethod)((int)des + 1))
{
Cube a, b;
a.DoMethod(wholeMethod);
a.DoMethod(src);
a.DoMethod(inverse(wholeMethod));
b.DoMethod(des);
if (a == b)
{
// found
printf("\t{%s, %s}", CubeRotateMethodEnumName[src].c_str(), CubeRotateMethodEnumName[des].c_str());
break;
}
}
printf(",\n");
}
printf("} },\n");
}*/

CubeSteps NoXYZFilter::Filter(CubeSteps &steps)
{
CubeSteps newSteps = steps;
auto currentMap = XYZMapTables[ROTATE_NONE];
size_t size = newSteps.size();
for (ptrdiff_t i = 0; i < (ptrdiff_t)size; ++i)
{
auto step = currentMap[newSteps[i]];
if (isWholeRotate(step))
{
CombineMapTable(currentMap, XYZMapTables[step]);
newSteps[i] = ROTATE_NONE;
}
else
{
newSteps[i] = step;
}
}
CubeSteps newNewSteps;
copySteps(newSteps, newNewSteps);
return newNewSteps;
}

NoXYZFilter::~NoXYZFilter()
{
}

void NoXYZFilter::CombineMapTable(map<CubeRotateMethod, CubeRotateMethod> &target, map<CubeRotateMethod, CubeRotateMethod> &mapTable)
{
for (CubeRotateMethod m = ROTATE_NONE; m <= ROTATE_WHOLEZi; m = (CubeRotateMethod)((int)m + 1))
{
target[m] = mapTable[target[m]];
}
}

0 comments on commit 8145f13

Please sign in to comment.