Project

General

Profile

Download (9.12 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TBJing.java @ 857c969a

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.tablebases;
11

    
12
import static org.distorted.objectlib.main.TwistyObject.SQ2;
13
import static org.distorted.objectlib.main.TwistyObject.SQ3;
14
import static org.distorted.objectlib.main.TwistyObject.SQ6;
15
import static org.distorted.objectlib.objects.TwistyJing.F;
16

    
17
import android.content.res.Resources;
18

    
19
import org.distorted.library.type.Static3D;
20
import org.distorted.objectlib.R;
21

    
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23

    
24
public class TBJing extends TablebasesPruning
25
{
26
  static final int[][][] QUATS_EDGE = new int[][][]
27
      {
28
          { { 0,10},{ 5, 3},{ 8, 4},{ 6, 2},{ 7, 1},{ 9,11} },
29
          { { 6, 4},{ 0,11},{ 3, 1},{ 5, 7},{ 9,10},{ 2, 8} },
30
          { { 7, 3},{ 4, 2},{ 0, 9},{11,10},{ 8, 6},{ 5, 1} },
31
          { { 5, 1},{ 6, 8},{11,10},{ 0, 9},{ 2, 4},{ 7, 3} },
32
          { { 8, 2},{ 9,10},{ 7, 5},{ 1, 3},{ 0,11},{ 4, 6} },
33
          { { 9,11},{ 1, 7},{ 6, 2},{ 8, 4},{ 3, 5},{ 0,10} }
34
      };
35

    
36
///////////////////////////////////////////////////////////////////////////////////////////////////
37

    
38
  public TBJing()
39
    {
40
    super();
41
    }
42

    
43
///////////////////////////////////////////////////////////////////////////////////////////////////
44

    
45
  public TBJing(Resources res)
46
    {
47
    super(res, new int[] {R.raw.jing_2_pruning4 ,R.raw.jing_2_pruning5 },
48
               new int[] {R.raw.jing_2_pruning11,R.raw.jing_2_pruning12} );
49
    }
50

    
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

    
53
  int[][] getBasicAngles()
54
    {
55
    int[] tmp = {3,3};
56
    return new int[][] { tmp,tmp,tmp,tmp };
57
    }
58

    
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60

    
61
  Static3D[] getRotationAxis()
62
    {
63
    return new Static3D[]
64
         {
65
           new Static3D(     0,-SQ3/3,-SQ6/3),
66
           new Static3D(     0,-SQ3/3, SQ6/3),
67
           new Static3D( SQ6/3, SQ3/3,     0),
68
           new Static3D(-SQ6/3, SQ3/3,     0),
69
         };
70
    }
71

    
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73

    
74
  float[][] getPosition()
75
    {
76
    return new float[][]
77
         {
78
           { 0.000f, -SQ2/2, 1.000f },
79
           { 0.000f, -SQ2/2,-1.000f },
80
           {-1.000f,  SQ2/2, 0.000f },
81
           { 1.000f,  SQ2/2, 0.000f },
82

    
83
           { 0.000f, -SQ2/2, 0.000f },
84
           {-0.500f, 0.000f, 0.500f },
85
           { 0.500f, 0.000f, 0.500f },
86
           {-0.500f, 0.000f,-0.500f },
87
           { 0.500f, 0.000f,-0.500f },
88
           { 0.000f,  SQ2/2, 0.000f },
89

    
90
           { 0.000f,  SQ2/6, 1.0f/3 },
91
           { 0.000f,  SQ2/6,-1.0f/3 },
92
           {-1.0f/3, -SQ2/6, 0.000f },
93
           { 1.0f/3, -SQ2/6, 0.000f },
94
         };
95
    }
96

    
97
///////////////////////////////////////////////////////////////////////////////////////////////////
98

    
99
  float[][] getCuts()
100
    {
101
    float[] cut = { (F-0.5f)*(SQ6/3) };
102
    return new float[][] { cut,cut,cut,cut };
103
    }
104

    
105
///////////////////////////////////////////////////////////////////////////////////////////////////
106

    
107
  boolean[][] getRotatable()
108
    {
109
    boolean[] tmp = new boolean[] {false,true};
110
    return new boolean[][] { tmp,tmp,tmp,tmp };
111
    }
112

    
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114
// specifically for the tablebase
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

    
117
  int getSize()
118
    {
119
    return 3732480;  // see https://www.jaapsch.net/puzzles/pyraminx.htm
120
    }
121

    
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123

    
124
  int getMinScramble()
125
    {
126
    return 9;
127
    }
128

    
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

    
131
  int[] getMidPruningLevels()
132
    {
133
    return new int[] {4,5};
134
    }
135

    
136
///////////////////////////////////////////////////////////////////////////////////////////////////
137

    
138
  int[] getHighPruningLevels()
139
    {
140
    return new int[] {11,12};
141
    }
142

    
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144

    
145
  int getGodsNumber()
146
    {
147
    return 12;
148
    }
149

    
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

    
152
  boolean moveCanProceed(int lastA, int lastR, int currA, int currR)
153
    {
154
    return lastA!=currA;
155
    }
156

    
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158

    
159
  public static void getEdgePermTwist(int[] perm, int[] twist, int[] quats, int index)
160
    {
161
    for(int i=0; i<6; i++)
162
      {
163
      int quat = quats[i+index];
164

    
165
      for(int j=0; j<6; j++)
166
        {
167
        int[] edge = QUATS_EDGE[i][j];
168
        if( quat==edge[0] ) { perm[i]=j; twist[i]=0; break; }
169
        if( quat==edge[1] ) { perm[i]=j; twist[i]=1; break; }
170
        }
171
      }
172
    }
173

    
174
///////////////////////////////////////////////////////////////////////////////////////////////////
175

    
176
  private int getVertexTwist(int[] quats)
177
    {
178
    int twist = 0;
179

    
180
    if( quats[3]==5 ) twist += 1;
181
    if( quats[3]==6 ) twist += 2;
182
    twist *= 3;
183
    if( quats[2]==7 ) twist += 1;
184
    if( quats[2]==8 ) twist += 2;
185
    twist *= 3;
186
    if( quats[1]==1 ) twist += 1;
187
    if( quats[1]==2 ) twist += 2;
188
    twist *= 3;
189
    if( quats[0]==3 ) twist += 1;
190
    if( quats[0]==4 ) twist += 2;
191

    
192
    return twist;
193
    }
194

    
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196

    
197
  private void getVertexQuats(int twist, int[] output)
198
    {
199
    switch(twist%3)
200
      {
201
      case 0: output[0]=0; break;
202
      case 1: output[0]=3; break;
203
      case 2: output[0]=4; break;
204
      }
205
    twist /= 3;
206

    
207
    switch(twist%3)
208
      {
209
      case 0: output[1]=0; break;
210
      case 1: output[1]=1; break;
211
      case 2: output[1]=2; break;
212
      }
213
    twist /= 3;
214

    
215
    switch(twist%3)
216
      {
217
      case 0: output[2]=0; break;
218
      case 1: output[2]=7; break;
219
      case 2: output[2]=8; break;
220
      }
221
    twist /= 3;
222

    
223
    switch(twist%3)
224
      {
225
      case 0: output[3]=0; break;
226
      case 1: output[3]=5; break;
227
      case 2: output[3]=6; break;
228
      }
229
    }
230

    
231
///////////////////////////////////////////////////////////////////////////////////////////////////
232

    
233
  private void getEdgeQuats(int twist, int[] perm, int[] output)
234
    {
235
    int totalTwist = 0;
236

    
237
    for(int i=0; i<5; i++)
238
      {
239
      int p = perm[i];
240
      int t = (twist%2);
241
      twist/=2;
242
      output[i+4] = QUATS_EDGE[i][p][t];
243

    
244
      totalTwist += t;
245
      }
246

    
247
    int p = perm[5];
248
    int t = (totalTwist%2)==0 ? 0:1;
249
    output[9] = QUATS_EDGE[5][p][t];
250
    }
251

    
252
///////////////////////////////////////////////////////////////////////////////////////////////////
253

    
254
  public int[] getQuats(int index)
255
    {
256
    int green_face = (index%4);
257
    index /= 4;
258
    int vertexTwist = (index%81);
259
    index /= 81;
260
    int edgeTwist = (index%32);
261
    int perm_num = index/32;
262

    
263
    int[] quats = new int[14];
264

    
265
    getVertexQuats(vertexTwist,quats);
266
    int[] permutation = new int[6];
267
    TablebaseHelpers.getEvenPermutationFromNum(permutation,perm_num);
268
    getEdgeQuats(edgeTwist,permutation,quats);
269

    
270
    // we don't need to care about the values of the last 3 quats, but do include them.
271
    switch(green_face)
272
      {
273
      case 0: quats[10] = 0; break;
274
      case 1: quats[10] = 5; break;
275
      case 2: quats[10] = 4; break;
276
      case 3: quats[10] = 3; break;
277
      }
278

    
279
    return quats;
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283

    
284
  public int getIndex(int[] quats)
285
    {
286
    int vertexTwist = getVertexTwist(quats);
287
    int[] permutation = new int[6];
288
    int[] twist = new int[6];
289
    getEdgePermTwist(permutation,twist,quats,4);
290

    
291
    int edgeTwist = twist[0]+ 2*(twist[1]+ 2*(twist[2]+ 2*(twist[3]+ 2*twist[4])));
292
    int perm_num = TablebaseHelpers.computeEvenPermutationNum(permutation);
293

    
294
    int green_face = -1;
295
    switch(quats[10])
296
      {
297
      case  0: case  1: case  2: green_face=0; break;
298
      case  5: case  8: case 10: green_face=1; break;
299
      case  4: case  7: case 11: green_face=2; break;
300
      case  3: case  6: case  9: green_face=3; break;
301
      }
302
/*
303
for(int i=0; i<6; i++) android.util.Log.e("D", "edge perm = "+permutation[i]);
304
android.util.Log.e("D", "ret: green_face="+green_face+" vertTwist="+vertexTwist+" edgeTwist="+edgeTwist+" perm: "+perm_num);
305
*/
306
    return green_face + 4*(vertexTwist + 81*(edgeTwist + 32*perm_num));
307
    }
308
}  
309

    
(6-6/13)