aboutsummaryrefslogtreecommitdiff
path: root/src/alg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alg.c')
-rw-r--r--src/alg.c127
1 files changed, 37 insertions, 90 deletions
diff --git a/src/alg.c b/src/alg.c
index 2815599..d806178 100644
--- a/src/alg.c
+++ b/src/alg.c
@@ -6,57 +6,6 @@ static int axis(Move m);
6static void free_alglistnode(AlgListNode *aln); 6static void free_alglistnode(AlgListNode *aln);
7static void realloc_alg(Alg *alg, int n); 7static void realloc_alg(Alg *alg, int n);
8 8
9bool
10allowed_HTM(Move m)
11{
12 return m >= U && m <= B3;
13}
14
15bool
16allowed_URF(Move m)
17{
18 Move b = base_move(m);
19
20 return b == U || b == R || b == F;
21}
22
23bool
24allowed_eofb(Move m)
25{
26 Move b = base_move(m);
27
28 return b == U || b == D || b == R || b == L ||
29 ((b == F || b == B) && m == b+1);
30}
31
32bool
33allowed_drud(Move m)
34{
35 Move b = base_move(m);
36
37 return b == U || b == D ||
38 ((b == R || b == L || b == F || b == B) && m == b + 1);
39}
40
41bool
42allowed_htr(Move m)
43{
44 Move b = base_move(m);
45
46 return moveset_HTM.allowed(m) && m == b + 1;
47}
48
49bool
50allowed_next_all(Move l2, Move l1, Move m)
51{
52 bool p, q;
53
54 p = l1 != NULLMOVE && base_move(l1) == base_move(m);
55 q = l2 != NULLMOVE && base_move(l2) == base_move(m);
56
57 return !(p || (commute(l1, l2) && q));
58}
59
60void 9void
61append_alg(AlgList *l, Alg *alg) 10append_alg(AlgList *l, Alg *alg)
62{ 11{
@@ -137,6 +86,32 @@ commute(Move m1, Move m2)
137 return axis(m1) == axis(m2); 86 return axis(m1) == axis(m2);
138} 87}
139 88
89int
90compare(Move m1, Move m2)
91{
92 if (!commute(m1, m2))
93 return 0;
94
95 return m1 < m2 ? 1 : -1;
96}
97
98int
99compare_last(Alg *alg, Move m, bool inverse)
100{
101 Move last;
102 int n;
103
104 if (inverse) {
105 n = alg->len_inverse;
106 last = n > 0 ? alg->move_inverse[n-1] : NULLMOVE;
107 } else {
108 n = alg->len_normal;
109 last = n > 0 ? alg->move_normal[n-1] : NULLMOVE;
110 }
111
112 return compare(last, m);
113}
114
140void 115void
141compose_alg(Alg *alg1, Alg *alg2) 116compose_alg(Alg *alg1, Alg *alg2)
142{ 117{
@@ -355,19 +330,6 @@ on_inverse(Alg *alg)
355 return ret; 330 return ret;
356} 331}
357 332
358bool
359possible_next(Move m, Moveset *ms, Move l0, Move l1)
360{
361 bool allowed, order;
362 uint64_t mbit;
363
364 mbit = ((uint64_t)1) << m;
365 allowed = mbit & ms->mask[l1][l0];
366 order = !commute(l0, m) || l0 < m;
367
368 return allowed && order;
369}
370
371void 333void
372print_alg(Alg *alg, bool l) 334print_alg(Alg *alg, bool l)
373{ 335{
@@ -431,6 +393,17 @@ realloc_alg(Alg *alg, int n)
431} 393}
432 394
433void 395void
396remove_last_move(Alg *a)
397{
398 a->len--;
399
400 if (a->inv[a->len])
401 a->len_inverse--;
402 else
403 a->len_normal--;
404}
405
406void
434swapmove(Move *m1, Move *m2) 407swapmove(Move *m1, Move *m2)
435{ 408{
436 Move aux; 409 Move aux;
@@ -484,29 +457,3 @@ unniss(Alg *alg)
484 457
485 return ret; 458 return ret;
486} 459}
487
488void
489init_moveset(Moveset *ms)
490{
491 int j;
492 uint64_t l, one;
493 Move m, l2, l1;
494
495 one = 1;
496
497 for (j = 0, m = U; m < NMOVES; m++)
498 if (ms->allowed(m))
499 ms->sorted_moves[j++] = m;
500 ms->sorted_moves[j] = NULLMOVE;
501
502 for (l1 = 0; l1 < NMOVES; l1++) {
503 for (l2 = 0; l2 < NMOVES; l2++) {
504 ms->mask[l2][l1] = 0;
505 for (l = 0; ms->sorted_moves[l] != NULLMOVE; l++) {
506 m = ms->sorted_moves[l];
507 if (ms->allowed_next(l2, l1, m))
508 ms->mask[l2][l1] |= (one<<m);
509 }
510 }
511 }
512}

Generated with cgit - Back to sebastiano.tronto.net