Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Uncategorized category for Berserk Rook by Rounin
def isBetween(a, b, value):
return (value > min(a, b)) and (value < max(a, b))
def blocks(start, end, piece):
return (start[0]==end[0] and start[0]==piece[0] and isBetween(start[1], end[1], piece[1])) or \
(start[1]==end[1] and start[1]==piece[1] and isBetween(ord(start[0]), ord(end[0]), ord(piece[0])))
def canReach(start, end, pieces):
if end[0] != start[0] and end[1] != start[1]:
return False
for p in range(len(pieces)):
if blocks(start, end, pieces[p]):
return False
return True
def tryMoves(start, pieces):
bestMove = [None, 0]
for p in range(len(pieces)):
if not canReach(start, pieces[p], pieces):
continue
move = tryMoves(pieces[p], pieces[0:p]+pieces[p+1:])
if move[1] >= bestMove[1]:
bestMove = [pieces[p], move[1]+1]
return bestMove
def berserk_rook(berserker, enemies):
return tryMoves(berserker, list(enemies))[1]
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert berserk_rook('d3', {'d6', 'b6', 'c8', 'g4', 'b8', 'g6'}) == 5, "one path"
assert berserk_rook('a2', {'f6', 'f2', 'a6', 'f8', 'h8', 'h6'}) == 6, "several paths"
assert berserk_rook('a2', {'f6', 'f8', 'f2', 'a6', 'h6'}) == 4, "Don't jump through"
Aug. 5, 2017