4.3 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
59da22823d04c95919d46269 | Задача про моряків, кокоси та мавп | 5 | 302304 | sailors-coconuts-and-a-monkey-problem |
--description--
П'ять моряків розбилися на острові і назбирали велику купу кокосів протягом дня. Тієї ночі перший моряк прокидається і вирішує завчасно взяти свою першу частку, тому намагається поділити купки з кокосами порівно на п'ять маленьких частин, але дізнається, що залишається один кокос, тому він кидає його мавпі і потім ховає "свій" в один із п'яти однакових за розміром куп з кокосами і зіштовхує інші чотири купи разом для того, щоб знову утворити єдину видиму купу з кокосами і йде спати. Коротше кажучи, кожний моряк один раз встає протягом ночі і виконує ті ж самі дії: ділить купу кокосів на 5 частин, знаходить один кокос, що залишився, і віддає його мавпі. Вранці( після спантеличених та окремих вчинків кожного з п'яти моряків протягом ночі), кокоси, що залишилися були поділені на п'ять однакових куп для кожного з моряків, після чого виявилося, що вони поділені порівно серед моряків без залишку. (Зранку нічого не залишилось для мавпи.)
--instructions--
Створіть функцію, що повертає мінімальний можливий розмір початкової купи з кокосами, зібраної протягом дня для N
моряків. Зверніть увагу: Звичайно, у світі розповідаються казки про збирання будь-якої кількості кокосових горіхів за день і множинні поділи купи, тощо, можуть виникнути у час, який відповідає сюжетній лінії, щоб таким чином не впливати на математику. Подивіться також:
- Мавпи і кокоси - Numberphile(Відео) Аналітичне рішення.
- A002021 Задача про купи з коксами Енциклопедія цінової послідовності цілих чисел. (Хоча деякі з цих посилань можуть використовувати альтернативну форму казки).
--hints--
splitCoconuts
має бути функцією.
assert(typeof splitCoconuts === 'function');
splitCoconuts(5)
має повернути 3121.
assert(splitCoconuts(5) === 3121);
splitCoconuts(6)
має повернути 233275.
assert(splitCoconuts(6) === 233275);
splitCoconuts(7)
має повернути 823537.
assert(splitCoconuts(7) === 823537);
--seed--
--seed-contents--
function splitCoconuts(intSailors) {
return true;
}
--solutions--
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;
}