Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Safe Coasts by mortonfox
def finish_map(regional_map):
def next_to_d(row, col):
return (col > 0 and regional_map[row][col - 1] == 'D' or
col < len(regional_map[row]) - 1 and regional_map[row][col + 1] == 'D' or
row > 0 and regional_map[row - 1][col] == 'D' or
row < len(regional_map) - 1 and regional_map[row + 1][col] == 'D')
def next_to_x(row, col):
for i in range(max(0, row - 1), min(row + 2, len(regional_map))):
for j in range(max(0, col - 1), min(col + 2, len(regional_map[i]))):
if regional_map[i][j] == 'X': return True
return False
regional_map = [list(row) for row in regional_map]
while True:
new_d = False
for i in range(0, len(regional_map)):
for j in range(0, len(regional_map[i])):
if regional_map[i][j] == '.' and next_to_d(i, j) and not next_to_x(i, j):
regional_map[i][j] = 'D'
new_d = True
if not new_d: break
return [''.join(row).replace('.', 'S') for row in regional_map]
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert isinstance(finish_map(("D..", "...", "...")), (list, tuple)), "List or tuple"
assert list(finish_map(("D..XX.....",
"...X......",
".......X..",
".......X..",
"...X...X..",
"...XXXXX..",
"X.........",
"..X.......",
"..........",
"D...X....D"))) == ["DDSXXSDDDD",
"DDSXSSSSSD",
"DDSSSSSXSD",
"DDSSSSSXSD",
"DDSXSSSXSD",
"SSSXXXXXSD",
"XSSSSSSSSD",
"SSXSDDDDDD",
"DSSSSSDDDD",
"DDDSXSDDDD"], "Example"
assert list(finish_map(("........",
"........",
"X.X..X.X",
"........",
"...D....",
"........",
"X.X..X.X",
"........",
"........",))) == ["SSSSSSSS",
"SSSSSSSS",
"XSXSSXSX",
"SSSSSSSS",
"DDDDDDDD",
"SSSSSSSS",
'XSXSSXSX',
"SSSSSSSS",
"SSSSSSSS"], "Walls"
Dec. 29, 2016