aboutsummaryrefslogtreecommitdiff
path: root/src/alg.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/alg.c180
1 files changed, 141 insertions, 39 deletions
diff --git a/src/alg.c b/src/alg.c
index 1158eba..ffe1679 100644
--- a/src/alg.c
+++ b/src/alg.c
@@ -2,27 +2,76 @@
2 2
3/* Local functions ***********************************************************/ 3/* Local functions ***********************************************************/
4 4
5static bool allowed_HTM(Move m);
6static bool allowed_URF(Move m);
7static bool allowed_eofb(Move m);
8static bool allowed_drud(Move m);
9static bool allowed_htr(Move m);
10static bool allowed_next_HTM(Move l2, Move l1, Move m);
11static int axis(Move m);
12
5static void free_alglistnode(AlgListNode *aln); 13static void free_alglistnode(AlgListNode *aln);
6static void realloc_alg(Alg *alg, int n); 14static void realloc_alg(Alg *alg, int n);
7 15
8/* Movesets ******************************************************************/ 16/* Movesets ******************************************************************/
9 17
10bool 18Moveset
11moveset_HTM(Move m) 19moveset_HTM = {
20 .allowed = allowed_HTM,
21 .allowed_next = allowed_next_HTM,
22};
23
24Moveset
25moveset_URF = {
26 .allowed = allowed_URF,
27 .allowed_next = allowed_next_HTM,
28};
29
30Moveset
31moveset_eofb = {
32 .allowed = allowed_eofb,
33 .allowed_next = allowed_next_HTM,
34};
35
36Moveset
37moveset_drud = {
38 .allowed = allowed_drud,
39 .allowed_next = allowed_next_HTM,
40};
41
42Moveset
43moveset_htr = {
44 .allowed = allowed_htr,
45 .allowed_next = allowed_next_HTM,
46};
47
48static int nmoveset = 5;
49static Moveset * all_ms[] = {
50 &moveset_HTM,
51 &moveset_URF,
52 &moveset_eofb,
53 &moveset_drud,
54 &moveset_htr,
55};
56
57/* Functions *****************************************************************/
58
59static bool
60allowed_HTM(Move m)
12{ 61{
13 return m >= U && m <= B3; 62 return m >= U && m <= B3;
14} 63}
15 64
16bool 65static bool
17moveset_URF(Move m) 66allowed_URF(Move m)
18{ 67{
19 Move b = base_move(m); 68 Move b = base_move(m);
20 69
21 return b == U || b == R || b == F; 70 return b == U || b == R || b == F;
22} 71}
23 72
24bool 73static bool
25moveset_eofb(Move m) 74allowed_eofb(Move m)
26{ 75{
27 Move b = base_move(m); 76 Move b = base_move(m);
28 77
@@ -30,8 +79,8 @@ moveset_eofb(Move m)
30 ((b == F || b == B) && m == b+1); 79 ((b == F || b == B) && m == b+1);
31} 80}
32 81
33bool 82static bool
34moveset_drud(Move m) 83allowed_drud(Move m)
35{ 84{
36 Move b = base_move(m); 85 Move b = base_move(m);
37 86
@@ -39,16 +88,65 @@ moveset_drud(Move m)
39 ((b == R || b == L || b == F || b == B) && m == b + 1); 88 ((b == R || b == L || b == F || b == B) && m == b + 1);
40} 89}
41 90
42bool 91static bool
43moveset_htr(Move m) 92allowed_htr(Move m)
44{ 93{
45 Move b = base_move(m); 94 Move b = base_move(m);
46 95
47 return moveset_HTM(m) && m == b + 1; 96 return moveset_HTM.allowed(m) && m == b + 1;
48} 97}
49 98
99static bool
100allowed_next_HTM(Move l2, Move l1, Move m)
101{
102 bool p, q;
50 103
51/* Functions *****************************************************************/ 104 p = l1 != NULLMOVE && base_move(l1) == base_move(m);
105 q = l2 != NULLMOVE && base_move(l2) == base_move(m);
106
107 return !(p || (commute(l1, l2) && q));
108}
109
110static int
111axis(Move m)
112{
113 Move i;
114
115 static bool initialized = false;
116 static int aux[NMOVES];
117
118 if (!initialized) {
119 for (i = 0; i < NMOVES; i++) {
120 if (i == NULLMOVE)
121 aux[i] = 0;
122
123 if (i >= U && i <= B3)
124 aux[i] = (i-1)/6 + 1;
125
126 if (i >= Uw && i <= Bw3)
127 aux[i] = (i-1)/6 - 2;
128
129 if (base_move(i) == E || base_move(i) == y)
130 aux[i] = 1;
131
132 if (base_move(i) == M || base_move(i) == x)
133 aux[i] = 2;
134
135 if (base_move(i) == S || base_move(i) == z)
136 aux[i] = 3;
137 }
138
139 initialized = true;
140 }
141
142 return aux[m];
143}
144
145bool
146commute(Move m1, Move m2)
147{
148 return axis(m1) == axis(m2);
149}
52 150
53void 151void
54append_alg(AlgList *l, Alg *alg) 152append_alg(AlgList *l, Alg *alg)
@@ -171,33 +269,6 @@ move_string(Move m)
171 return move_string_aux[m]; 269 return move_string_aux[m];
172} 270}
173 271
174void
175movelist_to_position(Move *movelist, int *position)
176{
177 Move m;
178
179 for (m = 0; m < NMOVES && movelist[m] != NULLMOVE; m++)
180 position[movelist[m]] = m;
181}
182
183void
184moveset_to_list(Moveset ms, Move *r)
185{
186 int n = 0;
187 Move i;
188
189 if (ms == NULL) {
190 fprintf(stderr, "Error: no moveset given\n");
191 return;
192 }
193
194 for (i = U; i < NMOVES; i++)
195 if (ms(i))
196 r[n++] = i;
197
198 r[n] = NULLMOVE;
199}
200
201Alg * 272Alg *
202new_alg(char *str) 273new_alg(char *str)
203{ 274{
@@ -405,3 +476,34 @@ unniss(Alg *alg)
405 } 476 }
406 free(aux); 477 free(aux);
407} 478}
479
480void
481init_movesets()
482{
483 int i, j;
484 uint64_t l, one;
485 Move m, l2, l1;
486 Moveset *ms;
487
488 one = 1;
489
490 for (i = 0; i < nmoveset; i++) {
491 ms = all_ms[i];
492
493 for (j = 0, m = U; m < NMOVES; m++)
494 if (ms->allowed(m))
495 ms->sorted_moves[j++] = m;
496 ms->sorted_moves[j] = NULLMOVE;
497
498 for (l1 = 0; l1 < NMOVES; l1++) {
499 for (l2 = 0; l2 < NMOVES; l2++) {
500 ms->mask[l2][l1] = 0;
501 for (l=0; ms->sorted_moves[l]!=NULLMOVE; l++) {
502 m = ms->sorted_moves[l];
503 if (ms->allowed_next(l2, l1, m))
504 ms->mask[l2][l1] |= (one<<m);
505 }
506 }
507 }
508 }
509}

Generated with cgit - Back to sebastiano.tronto.net