91 lines
4.3 KiB
Markdown
91 lines
4.3 KiB
Markdown
![]() |
---
|
|||
|
id: 59da22823d04c95919d46269
|
|||
|
title: 'Задача про моряків, кокоси та мавп'
|
|||
|
challengeType: 5
|
|||
|
forumTopicId: 302304
|
|||
|
dashedName: sailors-coconuts-and-a-monkey-problem
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
П'ять моряків розбилися на острові і назбирали велику купу кокосів протягом дня. Тієї ночі перший моряк прокидається і вирішує завчасно взяти свою першу частку, тому намагається поділити купки з кокосами порівно на п'ять маленьких частин, але дізнається, що залишається один кокос, тому він кидає його мавпі і потім ховає "свій" в один із п'яти однакових за розміром куп з кокосами і зіштовхує інші чотири купи разом для того, щоб знову утворити єдину видиму купу з кокосами і йде спати. Коротше кажучи, кожний моряк один раз встає протягом ночі і виконує ті ж самі дії: ділить купу кокосів на 5 частин, знаходить один кокос, що залишився, і віддає його мавпі. Вранці( після спантеличених та окремих вчинків кожного з п'яти моряків протягом ночі), кокоси, що залишилися були поділені на п'ять однакових куп для кожного з моряків, після чого виявилося, що вони поділені порівно серед моряків без залишку. (Зранку нічого не залишилось для мавпи.)
|
|||
|
|
|||
|
# --instructions--
|
|||
|
|
|||
|
Створіть функцію, що повертає мінімальний можливий розмір початкової купи з кокосами, зібраної протягом дня для `N` моряків. **Зверніть увагу:** Звичайно, у світі розповідаються казки про збирання будь-якої кількості кокосових горіхів за день і множинні поділи купи, тощо, можуть виникнути у час, який відповідає сюжетній лінії, щоб таким чином не впливати на математику. **Подивіться також:**
|
|||
|
|
|||
|
<ul>
|
|||
|
<li><a href="https://www.youtube.com/watch?v=U9qU20VmvaU" target="_blank">Мавпи і кокоси - Numberphile</a>(Відео) Аналітичне рішення.</li>
|
|||
|
<li><a href="https://oeis.org/A002021" target="_blank">A002021 Задача про купи з коксами</a> Енциклопедія цінової послідовності цілих чисел. (Хоча деякі з цих посилань можуть використовувати альтернативну форму казки).</li>
|
|||
|
</ul>
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
`splitCoconuts` має бути функцією.
|
|||
|
|
|||
|
```js
|
|||
|
assert(typeof splitCoconuts === 'function');
|
|||
|
```
|
|||
|
|
|||
|
`splitCoconuts(5)` має повернути 3121.
|
|||
|
|
|||
|
```js
|
|||
|
assert(splitCoconuts(5) === 3121);
|
|||
|
```
|
|||
|
|
|||
|
`splitCoconuts(6)` має повернути 233275.
|
|||
|
|
|||
|
```js
|
|||
|
assert(splitCoconuts(6) === 233275);
|
|||
|
```
|
|||
|
|
|||
|
`splitCoconuts(7)`має повернути 823537.
|
|||
|
|
|||
|
```js
|
|||
|
assert(splitCoconuts(7) === 823537);
|
|||
|
```
|
|||
|
|
|||
|
# --seed--
|
|||
|
|
|||
|
## --seed-contents--
|
|||
|
|
|||
|
```js
|
|||
|
function splitCoconuts(intSailors) {
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
# --solutions--
|
|||
|
|
|||
|
```js
|
|||
|
function splitCoconuts(intSailors) {
|
|||
|
let intNuts = intSailors;
|
|||
|
let result = splitCoconutsHelper(intNuts, intSailors);
|
|||
|
while (!result) {
|
|||
|
intNuts += 1;
|
|||
|
result = splitCoconutsHelper(intNuts, intSailors);
|
|||
|
}
|
|||
|
|
|||
|
return intNuts;
|
|||
|
}
|
|||
|
|
|||
|
function splitCoconutsHelper(intNuts, intSailors, intDepth) {
|
|||
|
const nDepth = intDepth !== undefined ? intDepth : intSailors;
|
|||
|
const portion = Math.floor(intNuts / intSailors);
|
|||
|
const remain = intNuts % intSailors;
|
|||
|
|
|||
|
if (portion <= 0 || remain !== (nDepth ? 1 : 0)) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
if (nDepth) {
|
|||
|
return splitCoconutsHelper(
|
|||
|
intNuts - portion - remain, intSailors, nDepth - 1
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
return intNuts;
|
|||
|
}
|
|||
|
```
|