--- title: Josephus problem id: 5a23c84252665b21eecc7ec5 challengeType: 5 --- ## Description
Josephus problem is a math puzzle with a grim description: $n$ prisoners are standing on a circle, sequentially numbered from $0$ to $n-1$. An executioner walks along the circle, starting from prisoner $0$, removing every $k$-th prisoner and killing him. As the process goes on, the circle becomes smaller and smaller, until only one prisoner remains, who is then freed. For example, if there are $n=5$ prisoners and $k=2$, the order the prisoners are killed in (let's call it the "killing sequence") will be 1, 3, 0, and 4, and the survivor will be #2. Given any $n, k > 0$, find out which prisoner will be the final survivor. In one such incident, there were 41 prisoners and every 3rd prisoner was being killed ($k=3$). Among them was a clever chap name Josephus who worked out the problem, stood at the surviving position, and lived on to tell the tale. Which number was he? Write a function that takes the initial number of prisoners and 'k' as parameter and returns the number of the prisoner that survives.
## Instructions
## Tests
```yml tests: - text: josephus should be a function. testString: assert(typeof josephus=='function','josephus should be a function.'); - text: josephus(30,3) should return a number. testString: assert(typeof josephus(30,3)=='number','josephus(30,3) should return a number.'); - text: josephus(30,3) should return 29. testString: assert.equal(josephus(30,3),29,'josephus(30,3) should return 29.'); - text: josephus(30,5) should return 3. testString: assert.equal(josephus(30,5),3,'josephus(30,5) should return 3.'); - text: josephus(20,2) should return 9. testString: assert.equal(josephus(20,2),9,'josephus(20,2) should return 9.'); - text: josephus(17,6) should return 2. testString: assert.equal(josephus(17,6),2,'josephus(17,6) should return 2.'); - text: josephus(29,4) should return 2. testString: assert.equal(josephus(29,4),2,'josephus(29,4) should return 2.'); ```
## Challenge Seed
```js function josephus (init, kill) { // Good luck! } ```
## Solution
```js function josephus (init, kill) { var Josephus = { init: function(n) { this.head = {}; var current = this.head; for (var i = 0; i < n - 1; i++) { current.label = i + 1; current.next = { prev: current }; current = current.next; } current.label = n; current.next = this.head; this.head.prev = current; return this; }, kill: function(spacing) { var current = this.head; while (current.next !== current) { for (var i = 0; i < spacing - 1; i++) { current = current.next; } current.prev.next = current.next; current.next.prev = current.prev; current = current.next; } return current.label; } } return Josephus.init(init).kill(kill) } ```