The big boss of Montreal Prison celebrates his 50th birthday next week. For this special occasion he came up with the idea to let some prisoners go. In the prison there are 600 cells, one person in each. The cells are numbered from 1 to 600. The prison guard should go through all cells and open the doors. Then he goes to the 2nd cell and flips the lock at every second cell (that is, close the door if it was open and open it if it was closed). Then go the 3rd cell and flip the lock of every third cell, etc. This procedure should be repeated with every cell. Question: who are those lucky guys who get release, i.e. which cells remain open at the end?
Example with 8 cells:
00000000 initialization, all cells are closed 11111111 step 1, flip every lock 10101010 step 2, flip every 2nd lock 10001110 step 3, flip every 3rd lock 10011111 step 4, flip every 4th lock 10010111 step 5, flip every 5th lock 10010011 step 6, flip every 6th lock 10010001 step 7, flip every 7th lock 10010000 step 8, flip every 8th lock
#!/usr/bin/env python SIZE=600 cells =  # initialization, all cells are closed for i in range(SIZE+1): # we won't use the cell at index 0 cells.append(0) for i in range(1, SIZE+1): # interval [1, SIZE], i.e. SIZE included for j in range(i, SIZE+1, i): cells[j] = 1 - cells[j] # Flip the lock. If it was 0, set it to 1, and vice versa. for i,v in enumerate(cells): if v == 1: print i,
I won’t answer the question, try it yourself :)
range(n) returns a list with elements from
n is excluded. For instance,
range(5) creates the list
[0, 1, 2, 3, 4]. For
range, you can specify the beginning of the interval too:
range(5, 10) returns
[5, 6, 7, 8, 9]. With the third parameter you can specify the step:
range(0, 10, 3) means every third element in the interval
[0, 3, 6, 9].
The function enumerate allows us to retrieve not only the values of a list, but the indexes too.