HOG2
RubiksInstances.cpp
Go to the documentation of this file.
1 //
2 // RubiksInstances.cpp
3 // hog2 glut
4 //
5 // Created by Nathan Sturtevant on 8/26/19.
6 //
7 
8 #include "RubiksInstances.h"
9 
11 
12 const int maxStrLength = 1024;
14 {
15  "L2 B D- L- F- B R2 F B R- F- R2 B- L2 D2 L2 D2 L2 U2 L2 F- D L- D2 L- F2 B2 L U- D- L B D2 F D- F- U- B L2 D2 L2 R2 B- U R- D2 F R- B L R U- B- R2 F- L2 R F R2 B L- F- D- F2 U2 R U- L D F2 B- R- D- L2 B- L- B2 L- D2 B2 D- B D R- B D L- B- R F- L- F- R2 D2 L2 B- L2 B2 U L2",
16  "B- R2 B D B- L B L2 F2 R F2 D- L2 U2 L- U L- U2 B- L- R- U D L- B2 D R- U F D2 F B U B2 L2 D2 R- B2 L- R2 U2 D2 F2 D R2 D2 B- U- D F- R B2 D R2 F L- B L2 R- U2 L F2 B- D- F- B- L2 D B2 U- D F2 U L2 D L- D- R2 D- B2 U- L2 U B- L- U- F- L- R- B- U- R B2 U2 B R- B- R2 F R-",
17  "L- R F- L R2 F2 D- L2 D B2 R2 D- F- L- F R F2 U L- B2 D- R- U- R D F R D B2 U- F- L2 F- B U- R F- U F D- L2 R- F- B L2 B2 D- R- B L B D- R U- R2 D2 F R U2 B2 D2 B R- F- L2 D2 L2 R D L- B2 U F2 R F L U D L- B2 L2 B2 D- L D2 B- U- B- U2 B L D B- L- U2 L- R D- R B2",
18  "L- B2 U2 R- D F U F2 D- F U D- R- B R U- R2 B R F D R2 F- R- B2 R- D- R2 U- F- R D F- R U- F B U- D2 B- L D2 L2 B- U2 L2 F2 L D2 B D- L R2 B2 U2 F2 B- U2 F D2 L2 U2 F2 L R- U- R- D F L2 F2 L- R U- L2 U R D F R- F- D- L- R2 U2 F R- B2 D B2 D2 B2 R F- L- D B- U L2 B-",
19  "B2 L- F- U2 R2 D R2 B U2 R B- L R F R- D- R- D2 F2 R2 B L2 D- B2 D2 L F- R B- R2 B2 D B- U R- D- L2 B2 L2 R2 B- U2 D- R2 B U- B- R- D L B- L R2 D- B L2 D2 F2 B- U2 B D- F- B L2 U F- U F- L U R U2 D- B- U2 D F- L F2 B2 L U B- D2 B2 L- D- L2 B- D2 F U2 R D2 L2 D B- L2 R-",
20  "B- R2 B R U- D- R2 D B L2 B2 U- F- B D2 R- U F L F U2 B L D- L- R2 B D R- F- B- D L- B- L2 R- U2 D B R- D2 B- U2 B- L- R2 F L U L- R B- R2 D2 R2 B- U2 F- U L D- F B- R2 D2 L B L U2 B2 R D- B- R2 B2 U F2 R2 U- B- R2 F2 U2 F2 B- D F U- F2 B R D R- U- L- R U2 D- R2 F",
21  "L- R- B L- D- L U2 B2 D- F2 D B2 R- F- R U2 B2 D2 L- B- D R2 D2 R D- R2 F- R U B- U2 B2 D- R- D2 F U D- F- U2 L2 U F2 R- B- U- L B- R- U- L- U2 B2 D B- R B D B2 R- U2 D- R- F L- F- D- B L2 R- B R- B- D R U- R2 B- D2 F- R F L- U L2 B2 R2 F- U- F D B- L- F2 B L2 U2 D- L2 B2",
22  "U F B2 L F2 L- D2 B2 L2 U- R D2 L2 U- D F U2 L2 B- U- B- R2 B2 R U R2 D- B2 R B2 L2 U- R D L- R2 U2 R- D B L2 R- B2 U2 L U2 R F2 U B2 L2 R2 D- F R2 D- L2 U- R B2 D2 R- U2 L- B- L- F- L R F L- B- D L- R2 F2 U- F L- U2 B U R2 F U R- B D B R- B- L- B2 R- F L- B2 L- F2 D2",
23  "L F2 L2 B2 D B R D- R- F2 U2 D2 F2 B- U- L- R2 B U2 R F- D2 B2 U- R- F L- U2 R- B L2 R2 B2 L2 R- B- D F2 L U2 D L- B2 L D- R2 D B2 U R- F2 U- R F2 R2 B U2 D2 R- U2 L2 R- D2 F2 R2 B- U B U F D- F D2 R- B- U2 B2 L D B- L- B2 D B2 D- B D- F- B- L- U B2 D2 B- D- F D- L F R",
24  "B2 D- B- U- R- D- B- U2 L- R- B2 U2 B2 L- U B- D F L2 F2 D F- L- D- B2 L- U2 F B2 R2 D L- U D2 F B- L2 B R- U B- L B2 D F R U- D- F R2 U2 L- B2 L- R- D- L2 R- F2 D L- D B2 D L B- R- D B- L2 B2 D2 F B2 U2 R- D- L- B2 R- D- L2 F- D- R U F L2 D- R- U- L2 B U- F2 U B- D F2 D2"
25 };
26 
27 int GetNextRCMove(const char *input, int &base)
28 {
29  int used = 0;
30  if (isdigit(input[0])) // this is our move notation - numeric
31  {
32  int curr = 0;
33  base = input[curr]-'0';
34  curr++;
35  if (isdigit(input[curr]))
36  {
37  base = base*10+input[curr]-'0';
38  curr++;
39  }
40  while (!isdigit(input[curr]) && input[curr] != '\n' && input[curr] != 0)
41  {
42  curr++;
43  }
44  return curr;
45  }
46  switch (input[0])
47  {
48  case 'F': used = 1; base = 1*3; break;
49  case 'B': used = 1; base = 3*3; break;
50  case 'L': used = 1; base = 2*3; break;
51  case 'R': used = 1; base = 4*3; break;
52  case 'U': used = 1; base = 0*3; break;
53  case 'D': used = 1; base = 5*3; break;
54  default: break;
55  }
56  if (used == 0)
57  return 0;
58 // if (input[0] != 'U')
59 // {
60 // bool stillGoing = true;
61 // int offset = 1;
62 // while (stillGoing)
63 // {
64 // switch (input[offset++])
65 // {
66 // case ' ': used++; break;
67 // case '\n': stillGoing = false; break;
68 // case '2': base += 2; used++; break;
69 // case '-': base += 1; used++; break;
70 // default: stillGoing = false; break;
71 // }
72 // }
73 // }
74  {
75 // base++;
76  bool stillGoing = true;
77  int offset = 1;
78  while (stillGoing)
79  {
80  switch (input[offset++])
81  {
82  case ' ': used++; break;
83  case '\n': stillGoing = false; break;
84  case '2': base += 2; used++; break;
85  case '-': base += 1; used++; break;
86  default: stillGoing = false; break;
87  }
88  }
89  }
90  return used;
91 }
92 
93 int GetNextRubicCubeMove(const char *input, int &base)
94 {
95  int used = 0;
96  if (isdigit(input[0])) // this is our move notation - numeric
97  {
98  int curr = 0;
99  base = input[curr]-'0';
100  curr++;
101  if (isdigit(input[curr]))
102  {
103  base = base*10+input[curr]-'0';
104  curr++;
105  }
106  while (!isdigit(input[curr]) && input[curr] != '\n' && input[curr] != 0)
107  {
108  curr++;
109  }
110  return curr;
111  }
112  switch (input[0])
113  {
114  case 'F': used = 1; base = 2*3; break;
115  case 'B': used = 1; base = 3*3; break;
116  case 'L': used = 1; base = 4*3; break;
117  case 'R': used = 1; base = 5*3; break;
118  case 'U': used = 1; base = 0*3; break;
119  case 'D': used = 1; base = 1*3; break;
120  default: break;
121  }
122  if (used == 0)
123  return 0;
124  if (input[0] != 'U')
125  {
126  bool stillGoing = true;
127  int offset = 1;
128  while (stillGoing)
129  {
130  switch (input[offset++])
131  {
132  case ' ': used++; break;
133  case '\n': stillGoing = false; break;
134  case '2': base += 2; used++; break;
135  case '-': base += 1; used++; break;
136  default: stillGoing = false; break;
137  }
138  }
139  }
140  else {
141  base++;
142  bool stillGoing = true;
143  int offset = 1;
144  while (stillGoing)
145  {
146  switch (input[offset++])
147  {
148  case ' ': used++; break;
149  case '\n': stillGoing = false; break;
150  case '2': base += 1; used++; break;
151  case '-': base -= 1; used++; break;
152  default: stillGoing = false; break;
153  }
154  }
155  }
156  return used;
157 }
158 
159 void GetKorfRubikInstance(RCState &start, int which)
160 {
161  assert(which >= 0 && which < 10);
162  RC c;
163 
164  char *string = KorfInstances[which];
165  start.Reset();
166 
167  // if (result == 0)
168  // {
169  // printf("No more entries found; exiting.\n");
170  // exit(0);
171  // }
172  int index = 0;
173  string[maxStrLength-1] = 0;
174  if (strlen(string) == maxStrLength-1)
175  {
176  printf("Warning: input hit maximum string length!\n");
177  exit(0);
178  }
179  while (true)
180  {
181  int act;
182  int cnt = GetNextRCMove(&string[index], act);
183  if (cnt == 0)
184  {
185  break;
186  }
187  else {
188  index += cnt;
189  }
190  c.ApplyAction(start, act);
191  }
192 }
193 
194 void GetKorfRubikInstance(RubiksState &start, int which)
195 {
196  const int maxStrLength = 1024;
197  assert(which >= 0 && which < 10);
198  RubiksCube c;
199 
200  char *string = KorfInstances[which];
201  start.Reset();
202 
203  // if (result == 0)
204  // {
205  // printf("No more entries found; exiting.\n");
206  // exit(0);
207  // }
208  int index = 0;
209  string[maxStrLength-1] = 0;
210  if (strlen(string) == maxStrLength-1)
211  {
212  printf("Warning: input hit maximum string length!\n");
213  exit(0);
214  }
215  while (true)
216  {
217  int act;
218  int cnt = GetNextRubicCubeMove(&string[index], act);
219  if (cnt == 0)
220  {
221  break;
222  }
223  else {
224  index += cnt;
225  }
226  c.ApplyAction(start, act);
227  }
228 }
229 
230 const char *GetStringFromMove(int move)
231 {
232  const char *str[] = {"U", "D", "L", "R", "B", "F", "U-", "D-", "L-", "R-", "B-", "F-", "U2", "D2", "L2", "R2", "B2", "F2"};
233  for (int x = 0; x < 18; x++)
234  {
235  int act;
236  GetNextRubicCubeMove(str[x], act);
237  if (act == move)
238  return str[x];
239  }
240  return "?";
241 }
242 
243 void GetRandomN(RubiksState &start, int N, int which)
244 {
245  start.Reset();
246  RubiksCube c;
247  srandom(which);
248  std::vector<RubiksAction> acts;
249  c.SetPruneSuccessors(true);
250  for (int x = 0; x < N; x++)
251  {
252  c.GetActions(start, acts);
253  c.ApplyAction(start, acts[random()%acts.size()]);
254  }
255 }
256 
257 void GetRandomN(RCState &start, int N, int which)
258 {
259  start.Reset();
260  RC c;
261  srandom(which);
262  std::vector<RubiksAction> acts;
263  c.SetPruneSuccessors(true);
264  for (int x = 0; x < N; x++)
265  {
266  c.GetActions(start, acts);
267  c.ApplyAction(start, acts[random()%acts.size()]);
268  }
269 }
270 
271 
272 void GetDepth20(RubiksState &start, int which)
273 {
274  const int maxStrLength = 1024;
275  char string[10][maxStrLength] = //"U R2 F B R B2 R U2 L B2 R U- D- R2 F R- L B2 U2 F2";
276  {
277  "B2 L B2 R- F- U- B- L D- F- L U L2 B2 L- D2 B2 D2 R2 B2",
278  "R U2 R D2 R2 B2 L- D- B- F U B- R- U2 L- D R2 F- U2 L2",
279  "D2 R2 F2 D2 F2 D2 R- F2 D- L2 R B L- F U R- B F2 R2 F-",
280  "D- F- U B2 R2 F R- U2 B- L D F R D2 R2 L2 D- R2 F2 D-",
281  "U2 R2 F2 D- U F2 U2 B U B- R U- F L B R- F L2 D- B",
282  "D B2 D- B2 R2 D- R2 U L R- D B- D R F- D2 R2 U- F- R",
283  "B D- L- F- L F B U- D2 F- R2 B- U F2 R- L U2 R2 F2 B2",
284  "U2 L- U2 F2 L- R D2 L2 B- D2 L F- R- U- L U2 F- D- R B",
285  "F- L B2 R U- B- L U2 D3 F L- R2 U2 D2 B2 R2 D R2 L2 F2",
286  "U2 R2 D2 B U2 B- F D- B- R- D U2 B2 F2 R- D- B U- F- R2"
287  };
288 
289  RubiksCube c;
290 
291  start.Reset();
292 
293  int index = 0;
294  while (true)
295  {
296  int act;
297  int cnt = GetNextRubicCubeMove(&string[which][index], act);
298  if (cnt == 0)
299  {
300  break;
301  }
302  else {
303  index += cnt;
304  }
305  c.ApplyAction(start, act);
306  }
307 }
308 
310 {
311  RubiksCube c;
312  const int maxStrLength = 64;
313  char string[maxStrLength] = "U R2 F B R B2 R U2 L B2 R U- D- R2 F R- L B2 U2 F2";
314 
315  start.Reset();
316 
317  int index = 0;
318  string[maxStrLength-1] = 0;
319  if (strlen(string) == maxStrLength-1)
320  {
321  printf("Warning: input hit maximum string length!\n");
322  exit(0);
323  }
324  while (true)
325  {
326  int act;
327  int cnt = GetNextRubicCubeMove(&string[index], act);
328  if (cnt == 0)
329  {
330  break;
331  }
332  else {
333  index += cnt;
334  }
335  c.ApplyAction(start, act);
336  }
337 }
338 
339 void GetSuperFlip(RCState &start)
340 {
341  RC c;
342  const int maxStrLength = 64;
343  char string[maxStrLength] = "U R2 F B R B2 R U2 L B2 R U- D- R2 F R- L B2 U2 F2";
344 
345  start.Reset();
346 
347  int index = 0;
348  string[maxStrLength-1] = 0;
349  if (strlen(string) == maxStrLength-1)
350  {
351  printf("Warning: input hit maximum string length!\n");
352  exit(0);
353  }
354  while (true)
355  {
356  int act;
357  int cnt = GetNextRCMove(&string[index], act);
358  if (cnt == 0)
359  {
360  break;
361  }
362  else {
363  index += cnt;
364  }
365  c.ApplyAction(start, act);
366  }
367 }
368 }
369 
RubiksCube
Definition: RubiksCube.h:106
RC
Definition: RC.h:244
RubiksCubeInstances::GetNextRCMove
int GetNextRCMove(const char *input, int &base)
Definition: RubiksInstances.cpp:27
RC::SetPruneSuccessors
void SetPruneSuccessors(bool val)
Definition: RC.h:381
RubiksInstances.h
RubiksCubeInstances::GetRandomN
void GetRandomN(RubiksState &start, int N, int which)
Definition: RubiksInstances.cpp:243
RubiksCubeInstances::GetDepth20
void GetDepth20(RubiksState &start, int which)
Definition: RubiksInstances.cpp:272
RC::GetActions
void GetActions(const RCState &nodeID, std::vector< RCAction > &actions) const
Definition: RC.cpp:1235
RubiksCubeInstances
Definition: RubiksInstances.cpp:10
RCState::Reset
void Reset()
Definition: RC.h:143
RubiksCubeInstances::GetKorfRubikInstance
void GetKorfRubikInstance(RCState &start, int which)
Definition: RubiksInstances.cpp:159
RubiksCube::SetPruneSuccessors
void SetPruneSuccessors(bool val)
Definition: RubiksCube.h:135
RubiksState
Definition: RubiksCube.h:27
RCState
Definition: RC.h:136
RC::ApplyAction
void ApplyAction(RCState &s, RCAction a) const
Definition: RC.cpp:1282
RubiksCubeInstances::maxStrLength
const int maxStrLength
Definition: RubiksInstances.cpp:12
RubiksCubeInstances::GetStringFromMove
const char * GetStringFromMove(int move)
Definition: RubiksInstances.cpp:230
RubiksState::Reset
void Reset()
Definition: RubiksCube.h:34
RubiksCubeInstances::GetSuperFlip
void GetSuperFlip(RubiksState &start)
Definition: RubiksInstances.cpp:309
RubiksCubeInstances::KorfInstances
char KorfInstances[10][maxStrLength]
Definition: RubiksInstances.cpp:13
RubiksCubeInstances::GetNextRubicCubeMove
int GetNextRubicCubeMove(const char *input, int &base)
Definition: RubiksInstances.cpp:93
RubiksCube::ApplyAction
virtual void ApplyAction(RubiksState &s, RubiksAction a) const
Definition: RubiksCube.cpp:86
RubiksCube::GetActions
virtual void GetActions(const RubiksState &nodeID, std::vector< RubiksAction > &actions) const
Definition: RubiksCube.cpp:43