Project

General

Profile

Download (10.7 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / solvers / SolverCube2.java @ 527557b7

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.solvers;
11

    
12
import android.content.res.Resources;
13

    
14
import org.distorted.main.R;
15
import org.distorted.objectlib.main.ObjectSignatures;
16
import org.distorted.objectlib.main.TwistyObject;
17
import org.distorted.objectlib.tablebases.ImplementedTablebasesList;
18
import org.distorted.objectlib.tablebases.TablebaseHelpers;
19
import org.distorted.objectlib.tablebases.TablebasesAbstract;
20

    
21
///////////////////////////////////////////////////////////////////////////////////////////////////
22

    
23
public class SolverCube2 extends SolverTablebase
24
{
25
  private static final int ERROR_CORNER_135_MISSING = -1;
26
  private static final int ERROR_CORNER_134_MISSING = -2;
27
  private static final int ERROR_CORNER_125_MISSING = -3;
28
  private static final int ERROR_CORNER_124_MISSING = -4;
29
  private static final int ERROR_CORNER_035_MISSING = -5;
30
  private static final int ERROR_CORNER_034_MISSING = -6;
31
  private static final int ERROR_CORNER_025_MISSING = -7;
32
  private static final int ERROR_CORNER_024_MISSING = -8;
33
  private static final int ERROR_CORNERS_CANNOT     = -9;
34
  private static final int ERROR_CORNER_TWISTED     = -10;
35

    
36
  TablebasesAbstract mSolver;
37
  private final int[] mFaceColors;
38

    
39
////////////////////////////////////////////////////////////////////////////////////////
40

    
41
  private void fillCornerTwists(int[] output, int[][] corners, int[] perm)
42
    {
43
    for(int i=0; i<8; i++)
44
      {
45
      int[] c = corners[perm[i]];
46

    
47
           if( c[0]==mFaceColors[0] || c[0]==mFaceColors[1] ) output[i] = 0;
48
      else if( c[1]==mFaceColors[0] || c[1]==mFaceColors[1] ) output[i] = 1;
49
      else                                                    output[i] = 2;
50
      }
51
    }
52

    
53
////////////////////////////////////////////////////////////////////////////////////////
54

    
55
  private int cornerIndex(int[][] corners, int i1, int i2, int i3)
56
    {
57
    int c1 = mFaceColors[i1];
58
    int c2 = mFaceColors[i2];
59
    int c3 = mFaceColors[i3];
60

    
61
    for(int i=0; i<8; i++)
62
      {
63
      int[] cor = corners[i];
64

    
65
      if( (cor[0]==c1 && cor[1]==c2 && cor[2]==c3) ||
66
          (cor[0]==c2 && cor[1]==c3 && cor[2]==c1) ||
67
          (cor[0]==c3 && cor[1]==c1 && cor[2]==c2)  ) return i;
68
      }
69

    
70
    return -1;
71
    }
72

    
73
////////////////////////////////////////////////////////////////////////////////////////
74

    
75
  private int retCornerPermutation(int[] output, int[][] corners)
76
    {
77
    for(int i=0; i<8; i++) output[i] = -1;
78

    
79
    output[0] = cornerIndex(corners, 1,2,5);
80
    output[1] = cornerIndex(corners, 1,4,2);
81
    output[2] = cornerIndex(corners, 1,5,3);
82
    output[3] = cornerIndex(corners, 1,3,4);
83
    output[4] = cornerIndex(corners, 0,5,2);
84
    output[5] = cornerIndex(corners, 0,2,4);
85
    output[6] = cornerIndex(corners, 0,3,5);
86
    output[7] = cornerIndex(corners, 0,4,3);
87

    
88
    if( output[0]==-1 ) return ERROR_CORNER_125_MISSING;
89
    if( output[1]==-1 ) return ERROR_CORNER_124_MISSING;
90
    if( output[2]==-1 ) return ERROR_CORNER_135_MISSING;
91
    if( output[3]==-1 ) return ERROR_CORNER_134_MISSING;
92
    if( output[4]==-1 ) return ERROR_CORNER_025_MISSING;
93
    if( output[5]==-1 ) return ERROR_CORNER_024_MISSING;
94
    if( output[6]==-1 ) return ERROR_CORNER_035_MISSING;
95
    if( output[7]==-1 ) return ERROR_CORNER_034_MISSING;
96

    
97
    return 0;
98
    }
99

    
100
////////////////////////////////////////////////////////////////////////////////////////
101

    
102
  private int findColor(int[][] corners, int c1, int c2)
103
    {
104
    for(int i=0; i<8; i++)
105
      {
106
      int[] cor = corners[i];
107

    
108
      if( cor[0]==c1 && cor[1]==c2 ) return cor[2];
109
      if( cor[1]==c1 && cor[2]==c2 ) return cor[0];
110
      if( cor[2]==c1 && cor[0]==c2 ) return cor[1];
111
      }
112

    
113
    return -1;
114
    }
115

    
116
////////////////////////////////////////////////////////////////////////////////////////
117

    
118
  private int computeFaceColors(int[][] corners)
119
    {
120
    mFaceColors[1] = corners[1][0];
121
    mFaceColors[2] = corners[1][2];
122
    mFaceColors[4] = corners[1][1];
123

    
124
    mFaceColors[0] = findColor(corners,mFaceColors[2],mFaceColors[4]);
125
    mFaceColors[3] = findColor(corners,mFaceColors[4],mFaceColors[1]);
126
    mFaceColors[5] = findColor(corners,mFaceColors[1],mFaceColors[2]);
127

    
128
    for(int i=0; i<6; i++)
129
      {
130
      int color = mFaceColors[i];
131
      if( color<0 ) return ERROR_CORNERS_CANNOT;
132

    
133
      for(int j=i+1; j<6; j++)
134
        if( mFaceColors[j]==color ) return ERROR_CORNERS_CANNOT;
135
      }
136

    
137
    return 0;
138
    }
139

    
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141

    
142
  public SolverCube2(Resources res, TwistyObject object)
143
    {
144
    super(res,object);
145
    mFaceColors = new int[6];
146
    }
147

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  public int tablebaseIndex(TwistyObject object)
151
    {
152
    int[][] corners= new int[8][3];
153

    
154
    corners[0][0] = object.getCubitFaceStickerIndex(0,1);
155
    corners[0][1] = object.getCubitFaceStickerIndex(0,3);
156
    corners[0][2] = object.getCubitFaceStickerIndex(0,5);
157

    
158
    corners[1][0] = object.getCubitFaceStickerIndex(1,3);
159
    corners[1][1] = object.getCubitFaceStickerIndex(1,5);
160
    corners[1][2] = object.getCubitFaceStickerIndex(1,1);
161

    
162
    corners[2][0] = object.getCubitFaceStickerIndex(2,5);
163
    corners[2][1] = object.getCubitFaceStickerIndex(2,1);
164
    corners[2][2] = object.getCubitFaceStickerIndex(2,3);
165

    
166
    corners[3][0] = object.getCubitFaceStickerIndex(3,1);
167
    corners[3][1] = object.getCubitFaceStickerIndex(3,3);
168
    corners[3][2] = object.getCubitFaceStickerIndex(3,5);
169

    
170
    corners[4][0] = object.getCubitFaceStickerIndex(4,1);
171
    corners[4][1] = object.getCubitFaceStickerIndex(4,3);
172
    corners[4][2] = object.getCubitFaceStickerIndex(4,5);
173

    
174
    corners[5][0] = object.getCubitFaceStickerIndex(5,1);
175
    corners[5][1] = object.getCubitFaceStickerIndex(5,3);
176
    corners[5][2] = object.getCubitFaceStickerIndex(5,5);
177

    
178
    corners[6][0] = object.getCubitFaceStickerIndex(6,1);
179
    corners[6][1] = object.getCubitFaceStickerIndex(6,3);
180
    corners[6][2] = object.getCubitFaceStickerIndex(6,5);
181

    
182
    corners[7][0] = object.getCubitFaceStickerIndex(7,1);
183
    corners[7][1] = object.getCubitFaceStickerIndex(7,3);
184
    corners[7][2] = object.getCubitFaceStickerIndex(7,5);
185

    
186
    int result0 = computeFaceColors(corners);
187
    if( result0<0 ) return result0;
188

    
189
    int[] corner_perm = new int[8];
190
    int result1 = retCornerPermutation(corner_perm,corners);
191
    if( result1<0 ) return result1;
192

    
193
    int[] perm = new int[7];
194

    
195
    perm[0] = corner_perm[0]>1 ? corner_perm[0]-1 : corner_perm[0];
196
    perm[1] = corner_perm[2]>1 ? corner_perm[2]-1 : corner_perm[2];
197
    perm[2] = corner_perm[3]>1 ? corner_perm[3]-1 : corner_perm[3];
198
    perm[3] = corner_perm[4]>1 ? corner_perm[4]-1 : corner_perm[4];
199
    perm[4] = corner_perm[5]>1 ? corner_perm[5]-1 : corner_perm[5];
200
    perm[5] = corner_perm[6]>1 ? corner_perm[6]-1 : corner_perm[6];
201
    perm[6] = corner_perm[7]>1 ? corner_perm[7]-1 : corner_perm[7];
202

    
203
    int perm_num = TablebaseHelpers.computePermutationNum(perm);
204
    int[] twist = new int[8];
205
    fillCornerTwists(twist,corners,corner_perm);
206

    
207
    int totalTwist = 0;
208
    for(int i=0; i<8; i++) totalTwist += twist[i];
209
    if( ((totalTwist)%3) != 0 ) return ERROR_CORNER_TWISTED;
210

    
211
    int twistNum = twist[0] + 3*(twist[2] + 3*(twist[3] + 3*(twist[4] + 3*(twist[5] + 3*twist[6]))));
212

    
213
    return twistNum + 729*perm_num;
214
    }
215

    
216
///////////////////////////////////////////////////////////////////////////////////////////////////
217

    
218
  private int getColorIndex4(int face)
219
    {
220
    switch(mFaceColors[face])
221
      {
222
      case 0: return R.string.color_yellow4;
223
      case 1: return R.string.color_white4;
224
      case 2: return R.string.color_blue4;
225
      case 3: return R.string.color_green4;
226
      case 4: return R.string.color_red4;
227
      case 5: return R.string.color_orange4;
228
      }
229

    
230
    return -1;
231
    }
232

    
233
///////////////////////////////////////////////////////////////////////////////////////////////////
234

    
235
  private int getColorIndex3(int face)
236
    {
237
    switch(mFaceColors[face])
238
      {
239
      case 0: return R.string.color_yellow3;
240
      case 1: return R.string.color_white3;
241
      case 2: return R.string.color_blue3;
242
      case 3: return R.string.color_green3;
243
      case 4: return R.string.color_red3;
244
      case 5: return R.string.color_orange3;
245
      }
246

    
247
    return -1;
248
    }
249

    
250
///////////////////////////////////////////////////////////////////////////////////////////////////
251

    
252
  private String cornerError(Resources res, int face0, int face1, int face2)
253
    {
254
    int j0 = getColorIndex3(face0);
255
    int j1 = getColorIndex3(face1);
256
    int j2 = getColorIndex4(face2);
257

    
258
    String c0 = res.getString(j0);
259
    String c1 = res.getString(j1);
260
    String c2 = res.getString(j2);
261

    
262
    return res.getString(R.string.solver_generic_missing_corner,c0,c1,c2);
263
    }
264

    
265
///////////////////////////////////////////////////////////////////////////////////////////////////
266

    
267
  public String error(int index, Resources res)
268
    {
269
    switch(index)
270
      {
271
      case ERROR_CORNER_135_MISSING: return cornerError(res,1,3,5);
272
      case ERROR_CORNER_134_MISSING: return cornerError(res,1,3,4);
273
      case ERROR_CORNER_125_MISSING: return cornerError(res,1,2,5);
274
      case ERROR_CORNER_124_MISSING: return cornerError(res,1,2,4);
275
      case ERROR_CORNER_035_MISSING: return cornerError(res,0,3,5);
276
      case ERROR_CORNER_034_MISSING: return cornerError(res,0,3,4);
277
      case ERROR_CORNER_025_MISSING: return cornerError(res,0,2,5);
278
      case ERROR_CORNER_024_MISSING: return cornerError(res,0,2,4);
279
      case ERROR_CORNERS_CANNOT    : return res.getString(R.string.solver_generic_corners_cannot);
280
      case ERROR_CORNER_TWISTED    : return res.getString(R.string.solver_generic_corner_twist);
281
      }
282

    
283
    return null;
284
    }
285

    
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287

    
288
  public int[][] solution(int index, Resources res)
289
    {
290
    if( mSolver==null )
291
      {
292
      mSolver = ImplementedTablebasesList.createUnpacked(ObjectSignatures.CUBE_2);
293
    //  if( mSolver!=null ) mSolver.createTablebase();
294
      }
295

    
296
    return mSolver!=null ? mSolver.solution(index,null) : null;
297
    }
298
}  
299

    
(2-2/10)