mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-04-13 22:00:19 -04:00
Co-authored-by: Naomi Carrigan <nhcarrigan@gmail.com> Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
99 lines
2.7 KiB
Markdown
99 lines
2.7 KiB
Markdown
---
|
||
id: 5a23c84252665b21eecc7ec5
|
||
title: Задача Йосипа Флавія
|
||
challengeType: 1
|
||
forumTopicId: 302294
|
||
dashedName: josephus-problem
|
||
---
|
||
|
||
# --description--
|
||
|
||
Задача Йосипа Флавія — це математична головоломка зі зловісною умовою: у колі стоять $n$ в’язнів, послідовно пронумерованих від $0$ до $n-1$.
|
||
|
||
Екзекутор ходить по колу. Він починає з в’язня під номером $0$, забирає із собою кожного $k$-го в’язня та вбиває його.
|
||
|
||
Коло стає все меншим і меншим, поки не залишиться лише один в’язень, якого потім відпускають.
|
||
|
||
Наприклад, якщо $n=5$ та $k=2$, то порядком вбитих в’язнів (назвемо це «послідовністю вбивств») буде 1, 3, 0 та 4, а №2 залишиться живим.
|
||
|
||
Дізнайтеся, хто з в’язнів виживе за будь-яких $n, k > 0$.
|
||
|
||
В одному з таких випадків був 41 в’язень, а кожен 3<sup>-ій</sup> був вбитий ($k=3$).
|
||
|
||
Серед них був розумний хлопець Йосип, який розв’язав цю задачу та обрав виграшну позицію, а згодом постійно розповідав про це.
|
||
|
||
Який номер він вибрав?
|
||
|
||
# --instructions--
|
||
|
||
Напишіть функцію, яка приймає початкову кількість в’язнів та `k` як параметри і повертає номер в’язня, який виживе.
|
||
|
||
# --hints--
|
||
|
||
`josephus` має бути функцією.
|
||
|
||
```js
|
||
assert(typeof josephus == 'function');
|
||
```
|
||
|
||
`josephus(30,3)` має повернути число.
|
||
|
||
```js
|
||
assert(typeof josephus(30, 3) == 'number');
|
||
```
|
||
|
||
`josephus(30,3)` має повернути `28`.
|
||
|
||
```js
|
||
assert.equal(josephus(30, 3), 28);
|
||
```
|
||
|
||
`josephus(30,5)` має повернути `2`.
|
||
|
||
```js
|
||
assert.equal(josephus(30, 5), 2);
|
||
```
|
||
|
||
`josephus(20,2)` має повернути `8`.
|
||
|
||
```js
|
||
assert.equal(josephus(20, 2), 8);
|
||
```
|
||
|
||
`josephus(17,6)` має повернути `1`.
|
||
|
||
```js
|
||
assert.equal(josephus(17, 6), 1);
|
||
```
|
||
|
||
`josephus(29,4)` має повернути `1`.
|
||
|
||
```js
|
||
assert.equal(josephus(29, 4), 1);
|
||
```
|
||
|
||
# --seed--
|
||
|
||
## --seed-contents--
|
||
|
||
```js
|
||
function josephus(init, kill) {
|
||
|
||
}
|
||
```
|
||
|
||
# --solutions--
|
||
|
||
```js
|
||
function josephus(init, kill) {
|
||
const arr = Array.from(Array(init).keys());
|
||
let curr = -1
|
||
while (arr.length > 1) {
|
||
curr = (curr + kill) % arr.length;
|
||
arr.splice(curr, 1);
|
||
curr--;
|
||
}
|
||
return arr[0];
|
||
}
|
||
```
|