Skip to content

Instantly share code, notes, and snippets.

@Resisty
Last active July 12, 2017 17:00
Show Gist options
  • Save Resisty/ff0d900d34997aad8ea0f5ae893a027a to your computer and use it in GitHub Desktop.
Save Resisty/ff0d900d34997aad8ea0f5ae893a027a to your computer and use it in GitHub Desktop.
#!/bin/python3
ROW = 0
COL = 1
def num_queen_attacks(boardlen, queen, obs):
counts = [0] * 8 # queen can attack in eight directions, moving clockwise:
# 0 is North, 1 is NE, etc
counts[0] = queen[ROW]
counts[1] = min([queen[ROW], boardlen - queen[COL] - 1])
counts[2] = boardlen - queen[COL] - 1
counts[3] = min([boardlen - queen[ROW] - 1, boardlen - queen[COL] - 1])
counts[4] = boardlen - queen[ROW] - 1
counts[5] = min([boardlen - queen[ROW] - 1, queen[COL]])
counts[6] = queen[COL]
counts[7] = min([queen[ROW], queen[COL]])
for obstacle in obs:
if obstacle[ROW] == queen[ROW]: # obstacle and queen are aligned horizontally
dist = obstacle[COL] - queen[COL]
if dist < 0: # obstacle to the left, direction is "6"
counts[6] = -dist - 1 if -dist - 1 < counts[6] else counts[6]
else: # obstacle to the right, direction is "2"
counts[2] = dist - 1 if dist - 1 < counts[2] else counts[2]
if obstacle[COL] == queen[COL]: # obs and queen are aligned vertically
dist = obstacle[ROW] - queen[ROW]
if dist < 0: # obstacle above, direction is "0"
counts[0] = -dist - 1 if -dist - 1 < counts[0] else counts[0]
else: # obstacle below, direction is "4"
counts[4] = dist - 1 if dist - 1 < counts[4] else counts[4]
if obstacle[ROW] - queen[ROW] == obstacle[COL] - queen[COL]: # obs and queen are aligned NW/SE
dist = obstacle[ROW] - queen[ROW]
if dist < 0: # obstacle is NW, direction is "7"
counts[7] = -dist - 1 if -dist - 1 < counts[7] else counts[7]
else: # obstacle is SE, direction is "3"
counts[3] = dist - 1 if dist - 1 < counts[3] else counts[3]
if obstacle[ROW] - queen[ROW] == -(obstacle[COL] - queen[COL]): # obs and queen are aligned NE/SW
dist = obstacle[ROW] - queen[ROW]
if dist < 0: # obstacle is NE, direction is "1"
counts[1] = -dist - 1 if -dist - 1 < counts[1] else counts[1]
else: # obstacle is SW, direction is "5"
counts[5] = dist - 1 if dist - 1 < counts[5] else counts[5]
return sum(counts)
n,k = input().strip().split(' ')
n,k = [int(n),int(k)]
rQueen,cQueen = input().strip().split(' ')
rQueen,cQueen = [int(rQueen) - 1,int(cQueen) - 1] # -1 because indexing arrays at 1 is a dick move
obstacles = []
for a0 in range(k):
rObstacle,cObstacle = input().strip().split(' ')
obstacles.append([int(rObstacle) - 1,int(cObstacle) - 1]) # don't be a dick, arrays start at 0
# your code goes here
# don't tell me what to do
print(num_queen_attacks(n, (rQueen, cQueen), obstacles))
@Resisty
Copy link
Author

Resisty commented Jul 12, 2017

AAAAAAAAAAAAAAAAARGH NE/SW backwards. That took way too long to discover.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment