Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TablebaseHelpers.java @ 522d858e

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 permNum)
131
    {
132
    int permSize = buffer.length;
133
    int index = permSize;
134
    int len = permSize-2;
135
    int totalSwaps = 0;
136

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

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

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

    
160
    int lower, upper;
161

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

    
173
    boolean first=true;
174

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

    
191
///////////////////////////////////////////////////////////////////////////////////////////////////
192

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

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

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

    
210
    return ret;
211
    }
212

    
213
///////////////////////////////////////////////////////////////////////////////////////////////////
214

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

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

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

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

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