Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Linear Algebra solution in Clear category for Wall Keeper by Sait2000
# https://sagecell.sagemath.org/?z=eJx1kE1ugzAQhfdI3GG6qDQGikKkbFDpsr1AV0EoovVQXBWI_INz_A6BZNGCF_bI8773xpbUQC2_nbGoEvAJtCIPA-ClyUAB5dsr7gXuRAURoOetFfd-qSqWzIpsuVYNKHgpwC82dyk8gd-Qx-DhGa7m_6h4k3pk4qGA3UpQtorg5JaJbTBeAzVZp_tJEQZh4Ll_CIN2PsKg46KrrVYXLP_8IzSD5jEVs3X_RcvnVWx71qq30KV0sdRLkif6bOln6E9MdGjch1SjklS8a0ciNVbjDbqxpXEdHo84CjbdQxRx0DUugXFKpN51pGtLqGkkbUiiHrwQ81BcTqKtAUSZ8xOiNq9Sy6Ob82AIRfULv2mSFw==&lang=sage
def wall_keeper(on_panels):
r = 0
for n in on_panels:
r ^= [
2, 1, 2984843, 7347549, 3856538,
16777219, 11373448, 1939159, 4673100, 5948871,
27626377, 28581213, 14211224, 7405569, 2609937,
17946327, 6612420, 16794387, 13192644, 791255,
13679258, 29453405, 24457995, 28580929, 14847010,
][n - 1]
return [25 - i for i, d in enumerate(bin(r)[2:][::-1]) if d == '1'][::-1]
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
from itertools import chain
def checker(solution, on_panels):
answer = solution(on_panels)
wk_p = list((0, 1)[n in on_panels] for n in range(1, 26))
p = list(wk_p[n: n+5] for n in range(0, 25, 5))
for a in answer:
r, c = (a-1) // 5, (a-1) % 5
p[r][c] = 1 - p[r][c]
if r+1 < 5:
p[r+1][c] = 1 - p[r+1][c]
if r-1 > -1:
p[r-1][c] = 1 - p[r-1][c]
if c+1 < len(p[0]):
p[r][c+1] = 1 - p[r][c+1]
if c-1 > -1:
p[r][c-1] = 1 - p[r][c-1]
return sum(chain(*p)) == 0
assert checker(wall_keeper, [5, 7, 13, 14, 18]), 'basic'
assert checker(wall_keeper, list(range(1, 26))), 'all_lights'
March 18, 2017
Comments: