-
Notifications
You must be signed in to change notification settings - Fork 0
/
check_the_check.py
90 lines (65 loc) · 2.41 KB
/
check_the_check.py
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
"""1.6.7 Check the Check"""
import array
import itertools
CHESSBOARD = array.array('u', '.' * 64)
game = 0
def check(fields, *pieces, jump=False):
for file, rank in fields:
if CHESSBOARD[8 * rank + file] in pieces:
return True
elif CHESSBOARD[8 * rank + file] == '.' or jump:
continue
else:
break
return False
def is_in_check(field):
file, rank = field
in_bounds = lambda f: 0 <= f[0] < 8 and 0 <= f[1] < 8
if CHESSBOARD[8 * rank + file] == 'K':
front = rank + 1
pawn, knight, bishop, queen, rook = 'pnbqr'
else:
front = rank - 1
pawn, knight, bishop, queen, rook = 'PNBQR'
up_rank = range(rank + 1, 8)
down_rank = range(rank - 1, -1, -1)
left_file = range(file - 1, -1, -1)
right_file = range(file + 1, 8)
knight_fields = filter(
in_bounds,
itertools.chain(
itertools.product([file - 2, file + 2], [rank - 1, rank + 1]),
itertools.product([file - 1, file + 1], [rank - 2, rank + 2])))
return any([
check(filter(in_bounds, [(file - 1, front)]), pawn),
check(filter(in_bounds, [(file + 1, front)]), pawn),
check(zip(left_file, itertools.repeat(rank, 8)), queen, rook),
check(zip(right_file, itertools.repeat(rank, 8)), queen, rook),
check(zip(itertools.repeat(file, 8), up_rank), queen, rook),
check(zip(itertools.repeat(file, 8), down_rank), queen, rook),
check(zip(left_file, up_rank), bishop, queen),
check(zip(left_file, down_rank), bishop, queen),
check(zip(right_file, up_rank), bishop, queen),
check(zip(right_file, down_rank), bishop, queen),
check(knight_fields, knight, jump=True)])
while True:
white_king = None
black_king = None
game += 1
for rank in range(7, -1, -1):
for file, c in zip(range(0, 8), input()):
CHESSBOARD[8 * rank + file] = c
if c == 'K':
white_king = (file, rank)
if c == 'k':
black_king = (file, rank)
_ = input()
if white_king is None or black_king is None:
break
if is_in_check(white_king):
checked_piece = 'white king'
elif is_in_check(black_king):
checked_piece = 'black king'
else:
checked_piece = 'no king'
print('Game #{}: {} is in check.'.format(game, checked_piece))