Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Wall Keeper by i.hiro.0513
def switch(board,panel):
flip = lambda x: (x+1)%2
board[panel] = flip(board[panel])
if panel > 4 : board[panel-5] = flip(board[panel-5])
if (panel+1)%5 > 0: board[panel+1] = flip(board[panel+1])
if panel < 20: board[panel+5] = flip(board[panel+5])
if panel%5 > 0: board[panel-1] = flip(board[panel-1])
return board
def wall_keeper(on_panels):
for i in range(8):
board = [0 for i in range(25)]
for j in on_panels:
board[j-1] = 1
ans = list(format(i, '03b') + '0'*22)
ans = [int(x) for x in ans]
for j in range(0,3):
if ans[j] == 1:
board = switch(board,j)
for j in range(5,25):
if board[j-5] == 1:
board = switch(board,j)
ans[j] = 1
if sum(board) == 0:
return [i+1 for i in range(25) if ans[i] == 1]
return []
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'
Aug. 27, 2017
Comments: