Co-authored-by: Naomi Carrigan <nhcarrigan@gmail.com> Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
2.7 KiB
id, title, challengeType, forumTopicId, dashedName
| id | title | challengeType | forumTopicId | dashedName |
|---|---|---|---|---|
| 5a23c84252665b21eecc7ec5 | Задача Йосипа Флавія | 1 | 302294 | josephus-problem |
--description--
Задача Йосипа Флавія — це математична головоломка зі зловісною умовою: у колі стоять n в’язнів, послідовно пронумерованих від 0 до n-1.
Екзекутор ходить по колу. Він починає з в’язня під номером 0, забирає із собою кожного $k$-го в’язня та вбиває його.
Коло стає все меншим і меншим, поки не залишиться лише один в’язень, якого потім відпускають.
Наприклад, якщо n=5 та k=2, то порядком вбитих в’язнів (назвемо це «послідовністю вбивств») буде 1, 3, 0 та 4, а №2 залишиться живим.
Дізнайтеся, хто з в’язнів виживе за будь-яких n, k > 0.
В одному з таких випадків був 41 в’язень, а кожен 3-ій був вбитий (k=3).
Серед них був розумний хлопець Йосип, який розв’язав цю задачу та обрав виграшну позицію, а згодом постійно розповідав про це.
Який номер він вибрав?
--instructions--
Напишіть функцію, яка приймає початкову кількість в’язнів та k як параметри і повертає номер в’язня, який виживе.
--hints--
josephus має бути функцією.
assert(typeof josephus == 'function');
josephus(30,3) має повернути число.
assert(typeof josephus(30, 3) == 'number');
josephus(30,3) має повернути 28.
assert.equal(josephus(30, 3), 28);
josephus(30,5) має повернути 2.
assert.equal(josephus(30, 5), 2);
josephus(20,2) має повернути 8.
assert.equal(josephus(20, 2), 8);
josephus(17,6) має повернути 1.
assert.equal(josephus(17, 6), 1);
josephus(29,4) має повернути 1.
assert.equal(josephus(29, 4), 1);
--seed--
--seed-contents--
function josephus(init, kill) {
}
--solutions--
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];
}