Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Creative category for Peaceable Queens by freeman_lex
def peaceable_queens(num: int) -> int:
hor = {row: set((row, col)
for col in range(num))
for row in range(num)}
ver = {col: set((row, col)
for row in range(num))
for col in range(num)}
dia1 = {}
for sum_ind in range(num * 2 - 1):
dia1[sum_ind] = set()
for col in range(sum_ind + 1):
row = sum_ind - col
if row < num and col < num:
dia1[sum_ind].add((row, col))
dia2 = {}
for diff_ind in range(-num + 1, num):
dia2[diff_ind] = set()
for row in range(num + diff_ind + 1):
col = row - diff_ind
if -1 < col < num and -1 < row < num:
dia2[diff_ind].add((row, col))
field = set((row, col)
for row in range(num)
for col in range(num))
start = set((row, col)
for row in range((num + 1) // 2)
for col in range((num + 1) // 2))
res = []
variants = [(set(), field, start)]
while True:
vars1 = []
for bl, wh_allowed, bl_allowed in variants:
for r, c in bl_allowed:
bl1 = bl.copy()
wh_allowed1 = wh_allowed.copy()
bl_allowed1 = bl_allowed.copy() if bl1 else set()
bl1.add((r, c))
beated = hor[r] | ver[c] | dia1[r + c] | dia2[r - c]
wh_allowed1 -= beated
bl_allowed1 |= beated
bl_allowed1 -= bl1
if len(wh_allowed1) > len(bl1):
vars1.append((bl1, wh_allowed1, bl_allowed1))
elif len(wh_allowed1) == len(bl1):
if res and len(bl1) > len(res[-1]):
res = []
if bl1 not in res:
res.append(bl1)
elif not res or (bl not in res and len(bl) == len(res[-1])):
res.append(bl)
if not vars1:
break
res = []
max_w = max(len(i[1]) for i in vars1)
variants = list(filter(lambda i: len(i[1]) == max_w, vars1))
return len(res[0]) if res else 0
print("Example:")
print(peaceable_queens(3))
# These "asserts" are used for self-checking
assert peaceable_queens(1) == 0
assert peaceable_queens(2) == 0
assert peaceable_queens(3) == 1
assert peaceable_queens(4) == 2
print("The mission is done! Click 'Check Solution' to earn rewards!")
Feb. 18, 2023
Comments: