Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TablebaseHelpers.java @ 74cc695a

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 java.util.Random;
13

    
14
///////////////////////////////////////////////////////////////////////////////////////////////////
15

    
16
public class TablebaseHelpers
17
{
18

    
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

    
21
  private static String print(int[][] move)
22
    {
23
    StringBuilder sb = new StringBuilder();
24

    
25
    if( move==null )
26
      {
27
      return ("move NULL!!");
28
      }
29

    
30
    for (int[] ints : move)
31
      {
32
      sb.append(' ');
33
      sb.append('(');
34
      sb.append(ints[0]);
35
      sb.append(' ');
36
      sb.append(ints[1]);
37
      sb.append(' ');
38
      sb.append(ints[2]);
39
      sb.append(')');
40
      }
41

    
42
    return sb.toString();
43
    }
44

    
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46

    
47
  public static void test(TablebasesAbstract tb)
48
    {
49
    int size = tb.getSize();
50

    
51
    for(int i=0; i<size; i++)
52
      {
53
      boolean success = tb.test(i);
54

    
55
      if( (!success && i>0) || (success && i==0) )
56
        {
57
        android.util.Log.e("D", "--------> FAILED: "+i);
58
        break;
59
        }
60

    
61
      if( (i%1000)==0 )   android.util.Log.e("D", "trying "+i);
62
      }
63
    }
64

    
65
///////////////////////////////////////////////////////////////////////////////////////////////////
66

    
67
  public static void test2(TablebasesAbstract tb, int num)
68
    {
69
    Random rnd = new Random();
70
    int size = tb.getSize();
71

    
72
    for(int i=0; i<num; i++)
73
      {
74
      int next = rnd.nextInt(size-1);
75
      int[][] moves = tb.solution(next);
76
      String moveSeq = print(moves);
77
      android.util.Log.e("D", (moves==null ? 0 : moves.length)+" Trying "+next+" : "+moveSeq);
78
      }
79
    }
80

    
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82

    
83
  private static int swaps(int val, int[] buffer, int len)
84
    {
85
    int ret = 0;
86

    
87
    for(int i=0; i<len; i++)
88
      {
89
           if( buffer[i] >val ) ret++;
90
      else if( buffer[i]==val ) return ret;
91
      }
92

    
93
    return -1;
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  public static boolean permutationIsEven(int[] buffer)
99
    {
100
    int len = buffer.length;
101
    int numOfSwaps = 0;
102
    for(int i=0; i<len-1; i++) numOfSwaps += swaps(i,buffer,len);
103
    return (numOfSwaps%2==0);
104
    }
105

    
106
///////////////////////////////////////////////////////////////////////////////////////////////////
107

    
108
  public static int computeEvenPermutationNum(int[] permutation)
109
    {
110
    int len = permutation.length-2;
111
    int ret = 0;
112
    int mul = 4;
113

    
114
    for(int i=0; i<len; i++)
115
      {
116
      ret += swaps(len-1-i,permutation,len+2);
117

    
118
      if( i<len-1 )
119
        {
120
        ret *= mul;
121
        mul++;
122
        }
123
      }
124

    
125
    return ret;
126
    }
127

    
128
///////////////////////////////////////////////////////////////////////////////////////////////////
129

    
130
  public static void getEvenPermutationFromNum(int[] buffer,int permSize, int permNum)
131
    {
132
    int index = permSize;
133
    int len = permSize-2;
134
    int totalSwaps = 0;
135

    
136
    for(int i=0; i<permSize; i++) buffer[i]=-1;
137

    
138
    for(int i=0; i<len; i++)
139
      {
140
      int swaps = (permNum%index);
141
      permNum /= index;
142
      index--;
143
      totalSwaps += swaps;
144

    
145
      for(int j=0; j<permSize; j++)
146
        {
147
        if( buffer[j]==-1 )
148
          {
149
          if( swaps==0 )
150
            {
151
            buffer[j] = i;
152
            break;
153
            }
154
          swaps--;
155
          }
156
        }
157
      }
158

    
159
    int lower, upper;
160

    
161
    if( (totalSwaps%2)==0 )
162
      {
163
      lower = permSize-2;
164
      upper = permSize-1;
165
      }
166
    else
167
      {
168
      lower = permSize-1;
169
      upper = permSize-2;
170
      }
171

    
172
    boolean first=true;
173

    
174
    for(int i=0; i<permSize; i++)
175
      if( buffer[i]==-1 )
176
        {
177
        if( first )
178
          {
179
          buffer[i] = lower;
180
          first=false;
181
          }
182
        else
183
          {
184
          buffer[i] = upper;
185
          break;
186
          }
187
        }
188
    }
189

    
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

    
192
  public static int computePermutationNum(int[] permutation)
193
    {
194
    int len = permutation.length-1;
195
    int ret = 0;
196
    int mul = 3;
197

    
198
    for(int i=0; i<len; i++)
199
      {
200
      ret += swaps(len-1-i,permutation,len+1);
201

    
202
      if( i<len-1 )
203
        {
204
        ret *= mul;
205
        mul++;
206
        }
207
      }
208

    
209
    return ret;
210
    }
211

    
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213

    
214
  public static void getPermutationFromNum(int[] buffer,int permSize, int permNum)
215
    {
216
    int index = permSize;
217
    int len = permSize-1;
218

    
219
    for(int i=0; i<permSize; i++) buffer[i]=-1;
220

    
221
    for(int i=0; i<len; i++)
222
      {
223
      int swaps = (permNum%index);
224
      permNum /= index;
225
      index--;
226

    
227
      for(int j=0; j<permSize; j++)
228
        {
229
        if( buffer[j]==-1 )
230
          {
231
          if( swaps==0 )
232
            {
233
            buffer[j] = i;
234
            break;
235
            }
236
          swaps--;
237
          }
238
        }
239
      }
240

    
241
    for(int i=0; i<permSize; i++)
242
      if( buffer[i]==-1 )
243
        {
244
        buffer[i] = permSize-1;
245
        break;
246
        }
247
    }
248
}
(3-3/8)