Project

General

Profile

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

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

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
///////////////////////////////////////////////////////////////////////////////////////////////////
13

    
14
public class TablebaseHelpers
15
{
16
  private static int swaps(int val, int[] buffer, int len)
17
    {
18
    int ret = 0;
19

    
20
    for(int i=0; i<len; i++)
21
      {
22
           if( buffer[i] >val ) ret++;
23
      else if( buffer[i]==val ) return ret;
24
      }
25

    
26
    return -1;
27
    }
28

    
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

    
31
  public static boolean permutationIsEven(int[] buffer)
32
    {
33
    int len = buffer.length;
34
    int numOfSwaps = 0;
35
    for(int i=0; i<len; i++) numOfSwaps += swaps(i,buffer,len);
36
    return (numOfSwaps%2==0);
37
    }
38

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

    
41
  public static int computeEvenPermutationNum(int[] permutation)
42
    {
43
    int len = permutation.length-2;
44
    int ret = 0;
45
    int mul = 4;
46

    
47
    for(int i=0; i<len; i++)
48
      {
49
      int n = swaps(len-1-i,permutation,len+2);
50

    
51
      ret += n;
52

    
53
      if( i<len-1 )
54
        {
55
        ret *= mul;
56
        mul++;
57
        }
58
      }
59

    
60
    return ret;
61
    }
62

    
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

    
65
  public static void getEvenPermutationFromNum(int[] buffer,int permSize, int permNum)
66
    {
67
    int index = permSize;
68
    int len = permSize-2;
69
    int totalSwaps = 0;
70

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

    
73
    for(int i=0; i<len; i++)
74
      {
75
      int swaps = (permNum%index);
76
      permNum /= index;
77
      index--;
78
      totalSwaps += swaps;
79

    
80
      for(int j=0; j<permSize; j++)
81
        {
82
        if( buffer[j]==-1 )
83
          {
84
          if( swaps==0 )
85
            {
86
            buffer[j] = i;
87
            break;
88
            }
89
          swaps--;
90
          }
91
        }
92
      }
93

    
94
    int lower, upper;
95

    
96
    if( (totalSwaps%2)==0 )
97
      {
98
      lower = permSize-2;
99
      upper = permSize-1;
100
      }
101
    else
102
      {
103
      lower = permSize-1;
104
      upper = permSize-2;
105
      }
106

    
107
    boolean first=true;
108

    
109
    for(int i=0; i<permSize; i++)
110
      if( buffer[i]==-1 )
111
        {
112
        if( first )
113
          {
114
          buffer[i] = lower;
115
          first=false;
116
          }
117
        else
118
          {
119
          buffer[i] = upper;
120
          break;
121
          }
122
        }
123

    
124
    }
125
}
(3-3/6)