def solve(i):
ls = i.splitlines()
lc = len(ls)
def axes_pos(x, y):
return y, x + y, lc - 1 - y + x
I = 2 ** 64
bmin = (I, I, I)
bmax = (0, 0, 0)
for y, line in enumerate(ls):
for x, char in enumerate(line):
if char != '#': continue
p = axes_pos(x, y)
bmax = tuple(map(max, bmax, p))
bmin = tuple(map(min, bmin, p))
result = ''
for y, line in enumerate(ls):
# if y > 0: result += '\n'
for x, char in enumerate(line):
if char != '.':
result += char
else:
p = axes_pos(x, y)
f = all(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
result += '#' if f else char
result += '\n'
return result
def run_test(a, b):
result = solve(a)
if result != b:
raise AssertionError('\n' + result + '\n\nshould be equal to\n\n' + b)
def run_tests():
run_test(
"#\n",
"#\n")
run_test(
" . . \n"
"# . #\n"
" . . \n",
" . . \n"
"# # #\n"
" . . \n")
run_test(
" . # \n"
". . .\n"
" # . \n",
" . # \n"
". # .\n"
" # . \n")
run_test(
" # . \n"
". . .\n"
" . # \n",
" # . \n"
". # .\n"
" . # \n")
run_test(
" # . \n"
"# . .\n"
" . # \n",
" # . \n"
"# # .\n"
" # # \n")
run_test(
" . # \n"
"# . .\n"
" . # \n",
" # # \n"
"# # #\n"
" # # \n")
run_test(
". . . . . . . . \n"
" . . # . # . . .\n"
". . . . . . . . \n"
" . . . # . . . .\n",
". . . . . . . . \n"
" . . # # # . . .\n"
". . . # # . . . \n"
" . . . # . . . .\n")
run_test(
". . . . . . . . \n"
" . . # . . . # .\n"
". . . . . . . . \n"
" . . . # . . . .\n",
". . . . . . . . \n"
" . . # # # # # .\n"
". . . # # # # . \n"
" . . . # # # . .\n")
run_test(
". . . . . . . . \n"
" . # . . . . . .\n"
". . . . . # . . \n"
" . . . . . . . .\n",
". . . . . . . . \n"
" . # # # # . . .\n"
". . # # # # . . \n"
" . . . . . . . .\n")
run_test(
". . . . . . . . \n"
" . # . . . . . .\n"
". . . . . # . . \n"
" . . # . . . . .\n",
". . . . . . . . \n"
" . # # # # . . .\n"
". . # # # # . . \n"
" . . # # # . . .\n")
run_test(
". . . . # . . . \n"
" . # . . . # . .\n"
". . . # . . . . \n"
" . . . . . # . .\n",
". . # # # # . . \n"
" . # # # # # . .\n"
". . # # # # # . \n"
" . . # # # # . .\n")
if __name__ == '__main__':
run_tests()
ZGVmIHNvbHZlKGkpOgogICAgbHMgPSBpLnNwbGl0bGluZXMoKQogICAgbGMgPSBsZW4obHMpCgogICAgZGVmIGF4ZXNfcG9zKHgsIHkpOgogICAgICAgIHJldHVybiB5LCB4ICsgeSwgbGMgLSAxIC0geSArIHgKCiAgICBJID0gMiAqKiA2NAogICAgYm1pbiA9IChJLCBJLCBJKQogICAgYm1heCA9ICgwLCAwLCAwKQoKICAgIGZvciB5LCBsaW5lIGluIGVudW1lcmF0ZShscyk6CiAgICAgICAgZm9yIHgsIGNoYXIgaW4gZW51bWVyYXRlKGxpbmUpOgogICAgICAgICAgICBpZiBjaGFyICE9ICcjJzogY29udGludWUKICAgICAgICAgICAgcCA9IGF4ZXNfcG9zKHgsIHkpCiAgICAgICAgICAgIGJtYXggPSB0dXBsZShtYXAobWF4LCBibWF4LCBwKSkKICAgICAgICAgICAgYm1pbiA9IHR1cGxlKG1hcChtaW4sIGJtaW4sIHApKQoKICAgIHJlc3VsdCA9ICcnCiAgICBmb3IgeSwgbGluZSBpbiBlbnVtZXJhdGUobHMpOgogICAgICAgICMgaWYgeSA+IDA6IHJlc3VsdCArPSAnXG4nCiAgICAgICAgZm9yIHgsIGNoYXIgaW4gZW51bWVyYXRlKGxpbmUpOgogICAgICAgICAgICBpZiBjaGFyICE9ICcuJzoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwID0gYXhlc19wb3MoeCwgeSkKICAgICAgICAgICAgICAgIGYgPSBhbGwoYm1pbltqXSA8PSBwW2pdIDw9IGJtYXhbal0gZm9yIGogaW4gcmFuZ2UoMCwgMykpCiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyMnIGlmIGYgZWxzZSBjaGFyCiAgICAgICAgcmVzdWx0ICs9ICdcbicKCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIHJ1bl90ZXN0KGEsIGIpOgogICAgcmVzdWx0ID0gc29sdmUoYSkKICAgIGlmIHJlc3VsdCAhPSBiOgogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdcbicgKyByZXN1bHQgKyAnXG5cbnNob3VsZCBiZSBlcXVhbCB0b1xuXG4nICsgYikKCgpkZWYgcnVuX3Rlc3RzKCk6CiAgICBydW5fdGVzdCgKICAgICAgICAiI1xuIiwKCiAgICAgICAgIiNcbiIpCgogICAgcnVuX3Rlc3QoCiAgICAgICAgIiAuIC4gXG4iCiAgICAgICAgIiMgLiAjXG4iCiAgICAgICAgIiAuIC4gXG4iLAoKICAgICAgICAiIC4gLiBcbiIKICAgICAgICAiIyAjICNcbiIKICAgICAgICAiIC4gLiBcbiIpCgogICAgcnVuX3Rlc3QoCiAgICAgICAgIiAuICMgXG4iCiAgICAgICAgIi4gLiAuXG4iCiAgICAgICAgIiAjIC4gXG4iLAoKICAgICAgICAiIC4gIyBcbiIKICAgICAgICAiLiAjIC5cbiIKICAgICAgICAiICMgLiBcbiIpCgogICAgcnVuX3Rlc3QoCiAgICAgICAgIiAjIC4gXG4iCiAgICAgICAgIi4gLiAuXG4iCiAgICAgICAgIiAuICMgXG4iLAoKICAgICAgICAiICMgLiBcbiIKICAgICAgICAiLiAjIC5cbiIKICAgICAgICAiIC4gIyBcbiIpCgogICAgcnVuX3Rlc3QoCiAgICAgICAgIiAjIC4gXG4iCiAgICAgICAgIiMgLiAuXG4iCiAgICAgICAgIiAuICMgXG4iLAoKICAgICAgICAiICMgLiBcbiIKICAgICAgICAiIyAjIC5cbiIKICAgICAgICAiICMgIyBcbiIpCgogICAgcnVuX3Rlc3QoCiAgICAgICAgIiAuICMgXG4iCiAgICAgICAgIiMgLiAuXG4iCiAgICAgICAgIiAuICMgXG4iLAoKICAgICAgICAiICMgIyBcbiIKICAgICAgICAiIyAjICNcbiIKICAgICAgICAiICMgIyBcbiIpCgogICAgcnVuX3Rlc3QoCiAgICAgICAgIi4gLiAuIC4gLiAuIC4gLiBcbiIKICAgICAgICAiIC4gLiAjIC4gIyAuIC4gLlxuIgogICAgICAgICIuIC4gLiAuIC4gLiAuIC4gXG4iCiAgICAgICAgIiAuIC4gLiAjIC4gLiAuIC5cbiIsCgogICAgICAgICIuIC4gLiAuIC4gLiAuIC4gXG4iCiAgICAgICAgIiAuIC4gIyAjICMgLiAuIC5cbiIKICAgICAgICAiLiAuIC4gIyAjIC4gLiAuIFxuIgogICAgICAgICIgLiAuIC4gIyAuIC4gLiAuXG4iKQoKICAgIHJ1bl90ZXN0KAogICAgICAgICIuIC4gLiAuIC4gLiAuIC4gXG4iCiAgICAgICAgIiAuIC4gIyAuIC4gLiAjIC5cbiIKICAgICAgICAiLiAuIC4gLiAuIC4gLiAuIFxuIgogICAgICAgICIgLiAuIC4gIyAuIC4gLiAuXG4iLAoKICAgICAgICAiLiAuIC4gLiAuIC4gLiAuIFxuIgogICAgICAgICIgLiAuICMgIyAjICMgIyAuXG4iCiAgICAgICAgIi4gLiAuICMgIyAjICMgLiBcbiIKICAgICAgICAiIC4gLiAuICMgIyAjIC4gLlxuIikKCiAgICBydW5fdGVzdCgKICAgICAgICAiLiAuIC4gLiAuIC4gLiAuIFxuIgogICAgICAgICIgLiAjIC4gLiAuIC4gLiAuXG4iCiAgICAgICAgIi4gLiAuIC4gLiAjIC4gLiBcbiIKICAgICAgICAiIC4gLiAuIC4gLiAuIC4gLlxuIiwKCiAgICAgICAgIi4gLiAuIC4gLiAuIC4gLiBcbiIKICAgICAgICAiIC4gIyAjICMgIyAuIC4gLlxuIgogICAgICAgICIuIC4gIyAjICMgIyAuIC4gXG4iCiAgICAgICAgIiAuIC4gLiAuIC4gLiAuIC5cbiIpCgogICAgcnVuX3Rlc3QoCiAgICAgICAgIi4gLiAuIC4gLiAuIC4gLiBcbiIKICAgICAgICAiIC4gIyAuIC4gLiAuIC4gLlxuIgogICAgICAgICIuIC4gLiAuIC4gIyAuIC4gXG4iCiAgICAgICAgIiAuIC4gIyAuIC4gLiAuIC5cbiIsCgogICAgICAgICIuIC4gLiAuIC4gLiAuIC4gXG4iCiAgICAgICAgIiAuICMgIyAjICMgLiAuIC5cbiIKICAgICAgICAiLiAuICMgIyAjICMgLiAuIFxuIgogICAgICAgICIgLiAuICMgIyAjIC4gLiAuXG4iKQoKICAgIHJ1bl90ZXN0KAogICAgICAgICIuIC4gLiAuICMgLiAuIC4gXG4iCiAgICAgICAgIiAuICMgLiAuIC4gIyAuIC5cbiIKICAgICAgICAiLiAuIC4gIyAuIC4gLiAuIFxuIgogICAgICAgICIgLiAuIC4gLiAuICMgLiAuXG4iLAoKICAgICAgICAiLiAuICMgIyAjICMgLiAuIFxuIgogICAgICAgICIgLiAjICMgIyAjICMgLiAuXG4iCiAgICAgICAgIi4gLiAjICMgIyAjICMgLiBcbiIKICAgICAgICAiIC4gLiAjICMgIyAjIC4gLlxuIikKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcnVuX3Rlc3RzKCkK