Files
freeCodeCamp/curriculum/challenges/ukrainian/22-rosetta-code/rosetta-code-challenges/josephus-problem.md
camperbot 7a0d396180 chore(i18n,learn): processed translations (#53415)
Co-authored-by: Naomi Carrigan <nhcarrigan@gmail.com>
Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
2024-02-13 18:31:01 +01:00

99 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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];
}
```