SHOW:
|
|
- or go back to the newest paste.
| 1 | I made many off-by-one errors on the way to this proposed solution, but I think I have it. | |
| 2 | ||
| 3 | - | Assign each knight a position number, starting with 1 and going counterclockwise. |
| 3 | + | Assign each knight a position number, starting with 1 and going clockwise. |
| 4 | ||
| 5 | At any given time, let N be the number of remaining knights. Let P be the lowest position of the remaining knights. For example, we might start with 13 knights. After the initial sit-down, before Arthur has dismissed anyone, the list of knights will look like this, where horizontal position indicates each knight's position number: | |
| 6 | ||
| 7 | x x x x x x x x x x x x x (N = 13, P = 1) | |
| 8 | ||
| 9 | We want to calculate in the general case what P will be when N reaches 1. | |
| 10 | ||
| 11 | I'll use the N = 13 example, and transform the list in three iterations to arrive at N = 1. | |
| 12 | ||
| 13 | For the first iteration, remove the even-numbered knights -- and ALSO remove the FIRST knight in the list. We know he will be removed when Arthur comes back around the circle, because N = 13 is odd, so we proactively throw him away. This gives us: | |
| 14 | ||
| 15 | x x x x x x x x x x x x x (N = 13, P = 1) | |
| 16 | - - x - x - x - x - x - x (N = 6, P = 3) | |
| 17 | ||
| 18 | For the second iteration, where N = 6 is even, remove the second, fourth, and sixth knights, but DON'T throw away the first knight. So: | |
| 19 | ||
| 20 | x x x x x x x x x x x x x (N = 13, P = 1) | |
| 21 | - - x - x - x - x - x - x (N = 6, P = 3) | |
| 22 | - - x - - - x - - - x - - (N = 3, P = 3) | |
| 23 | ||
| 24 | For the third iteration, because N is now odd again, throw away the second knight AND (proactively) the first knight: | |
| 25 | ||
| 26 | x x x x x x x x x x x x x (N = 13, P = 1) | |
| 27 | - - x - x - x - x - x - x (N = 6, P = 3) | |
| 28 | - - x - - - x - - - x - - (N = 3, P = 3) | |
| 29 | - - - - - - - - - - x - - (N = 1, P = 11) | |
| 30 | ||
| 31 | Note that with each iteration, the difference between consecutive positions doubles from 1 to 2 to 4 to 8. The above could be written as | |
| 32 | ||
| 33 | x x x x x x x x x x x x x (N = 13, P = 1) | |
| 34 | - - x - x - x - x - x - x (N = 6, P = 1 + 2) | |
| 35 | - - x - - - x - - - x - - (N = 3, P = 1 + 2 + 0) | |
| 36 | - - - - - - - - - - x - - (N = 1, P = 1 + 2 + 0 + 8) | |
| 37 | ||
| 38 | Therefore, when P changes (due to the lowest-numbered knight getting tossed), it increases by a power of 2. | |
| 39 | ||
| 40 | With this observation, I propose the following algorithm: | |
| 41 | ||
| 42 | start with N = # of knights, P = 1, i = 1 (P for position, i for iteration) | |
| 43 | ||
| 44 | while (N > 1) {
| |
| 45 | if N is odd | |
| 46 | N = (N - 1)/2, P = P + 2^i | |
| 47 | else | |
| 48 | N = N / 2 | |
| 49 | i = i + 1 | |
| 50 | } |