-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmasks.hs
138 lines (102 loc) · 3.04 KB
/
masks.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
module Masks where
import Data.Bits
import Data.List
import qualified Data.Vector.Unboxed as V
import Data.Word
invalid :: Word64
invalid = 64 :: Word64
mapBoard :: Int -> Word64 -- maps board
mapBoard i = V.fromList [invalid, field 29, invalid, field 30, invalid, field 31, invalid, field 32,
field 25, invalid, field 26, invalid, field 27, invalid, field 28, invalid,
invalid, field 21, invalid, field 22, invalid, field 23, invalid, field 24,
field 17, invalid, field 18, invalid, field 19, invalid, field 20, invalid,
invalid, field 13, invalid, field 14, invalid, field 15, invalid, field 16,
field 9, invalid, field 10, invalid, field 11, invalid, field 12, invalid,
invalid, field 5, invalid, field 6, invalid, field 7, invalid, field 8,
field 1, invalid, field 2, invalid, field 3, invalid, field 4, invalid] V.! i
reverseBoardIndexing :: Int -> Int
reverseBoardIndexing i = V.fromList [-1, 29, 30, 31, 32, 25, 26, 27, 28, 21, 22, 23, 24, 17, 18, 19, 20, 13, 14, 15, 16, 9, 10, 11, 12, 5, 6, 7, 8, 1, 2, 3, 4] V.! i
kBoard :: Int -> Int -- board mapping
kBoard i = V.fromList [30,33,33,33,33,34,34,33,34,36,36,35,36,38,38,34,34,38,38,36,35,36,36,34,33,34,34,33,33,33,33,30] V.! (i - 1)
bitsOnTheBoard :: Word64
bitsOnTheBoard = mergeBoardFields [1..32]
mergeBoardFields :: [Int] -> Word64
mergeBoardFields = foldl' (.|.) 0 . getBoardFields
getBoardFields :: [Int] -> [Word64]
getBoardFields = map field
getIndex :: Word64 -> Word64
getIndex x
| x == 0 = 0
| otherwise = fromIntegral $ 63 - countLeadingZeros x
s :: Word64 -> Word64 -- get powers of two
s i = if i < 64 then unsafeShiftL 1 (fromIntegral i) else 0
field :: Int -> Word64
field 0 = 0
field 1 = s 0
field 2 = s 8
field 3 = s 16
field 4 = s 24
field 5 = s 9
field 6 = s 17
field 7 = s 25
field 8 = s 33
field 9 = s 10
field 10 = s 18
field 11 = s 26
field 12 = s 34
field 13 = s 19
field 14 = s 27
field 15 = s 35
field 16 = s 43
field 17 = s 20
field 18 = s 28
field 19 = s 36
field 20 = s 44
field 21 = s 29
field 22 = s 37
field 23 = s 45
field 24 = s 53
field 25 = s 30
field 26 = s 38
field 27 = s 46
field 28 = s 54
field 29 = s 39
field 30 = s 47
field 31 = s 55
field 32 = s 63
field _ = invalid
rfield :: Word64 -> Int
rfield 0 = 0
rfield 1 = 1
rfield 256 = 2
rfield 65536 = 3
rfield 16777216 = 4
rfield 512 = 5
rfield 131072 = 6
rfield 33554432 = 7
rfield 8589934592 = 8
rfield 1024 = 9
rfield 262144 = 10
rfield 67108864 = 11
rfield 17179869184 = 12
rfield 524288 = 13
rfield 134217728 = 14
rfield 34359738368 = 15
rfield 8796093022208 = 16
rfield 1048576 = 17
rfield 268435456 = 18
rfield 68719476736 = 19
rfield 17592186044416 = 20
rfield 536870912 = 21
rfield 137438953472 = 22
rfield 35184372088832 = 23
rfield 9007199254740992 = 24
rfield 1073741824 = 25
rfield 274877906944 = 26
rfield 70368744177664 = 27
rfield 18014398509481984 = 28
rfield 549755813888 = 29
rfield 140737488355328 = 30
rfield 36028797018963968 = 31
rfield 9223372036854775808 = 32
rfield _ = 0