-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconstants.py
More file actions
106 lines (83 loc) · 2.42 KB
/
Copy pathconstants.py
File metadata and controls
106 lines (83 loc) · 2.42 KB
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
"""
Global constant file
"""
from array import array
from itertools import product
from functools import reduce
from bitarray import bitarray
# Screen dimensions
WIDTH, HEIGHT = 600, 600
ROWS, COLS = 6, 7
SQUARE_WIDTH = WIDTH // COLS
SQUARE_HEIGHT = HEIGHT // ROWS
PADDING = 15
OUTLINE = 2
# Colors
RED = (255, 0, 0)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GREY = (128, 128, 128)
WHITE = (255, 255, 255)
WHITE_BASE = (50, 168, 74)
BLACK_BASE = (50, 152, 168)
EXIT_BASE = (140, 50, 168)
SELECTED = (214, 211, 150)
# Value
MAX_SCORE = 1
# Number vals
ROW_CHECK = [
(0b1000001000001000001 << ROWS * n4) << nr
for nr, n4 in product(range(ROWS), range(4))
]
COL_CHECK = [(0b1111 << n4) << ROWS * nc for nc, n4 in product(range(COLS), range(3))]
def generate_diag_check():
arr = []
for v in [(3, 0), (2, 0), (1, 0), (0, 0), (0, 1), (0, 2), (0, 3)]:
start = v
while start[0] + 3 < ROWS and start[1] + 3 < COLS:
db = bitarray("0" * ROWS * COLS)
for i in range(4):
ind = (start[1] + i) * ROWS + (start[0] + i)
db[ind] = 1
arr.append(db)
start = start[0] + 1, start[1] + 1
for v in [(3, 0), (4, 0), (5, 0), (5, 1), (5, 2), (5, 3)]:
start = v
while start[0] - 3 >= 0 and start[1] + 3 < COLS:
db = bitarray("0" * ROWS * COLS)
for i in range(4):
ind = (start[0] - i) + (start[1] + i) * ROWS
db[ind] = 1
arr.append(db)
start = start[0] - 1, start[1] + 1
return list(map(conv_to_num, arr))
def conv_to_num(bt: bitarray) -> int:
return reduce(lambda a, b: a << 1 | b, bt[::-1], 0)
DIAG_CHECK = generate_diag_check()
CHECK = array('Q', ROW_CHECK + COL_CHECK + DIAG_CHECK)
FULL_BOARD = 2**(ROWS*COLS) - 1
def print_num(n: int):
st = f"{n:0{ROWS*COLS}b}"[::-1]
s = []
for i in range(ROWS):
t = ""
for j in range(COLS):
t += st[i + j * ROWS]
s.append(t)
return "\n".join(s[::-1])
if __name__ == "__main__":
def main():
# print("====ROWS====")
# for r in ROW_CHECK:
# print_num(r)
# print("--")
# print("====COLS====")
# for r in COL_CHECK:
# print_num(r)
# print("--")
for r in CHECK[:10]:
print(r)
print(print_num(r))
print("--")
print(print_num(FULL_BOARD))
main()