freeCodeCamp/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/sailors-coconuts-and-a-monk...

4.3 KiB
Raw Blame History

id title challengeType forumTopicId dashedName
59da22823d04c95919d46269 Задача про моряків, кокоси та мавп 5 302304 sailors-coconuts-and-a-monkey-problem

--description--

П'ять моряків розбилися на острові і назбирали велику купу кокосів протягом дня. Тієї ночі перший моряк прокидається і вирішує завчасно взяти свою першу частку, тому намагається поділити купки з кокосами порівно на п'ять маленьких частин, але дізнається, що залишається один кокос, тому він кидає його мавпі і потім ховає "свій" в один із п'яти однакових за розміром куп з кокосами і зіштовхує інші чотири купи разом для того, щоб знову утворити єдину видиму купу з кокосами і йде спати. Коротше кажучи, кожний моряк один раз встає протягом ночі і виконує ті ж самі дії: ділить купу кокосів на 5 частин, знаходить один кокос, що залишився, і віддає його мавпі. Вранці( після спантеличених та окремих вчинків кожного з п'яти моряків протягом ночі), кокоси, що залишилися були поділені на п'ять однакових куп для кожного з моряків, після чого виявилося, що вони поділені порівно серед моряків без залишку. (Зранку нічого не залишилось для мавпи.)

--instructions--

Створіть функцію, що повертає мінімальний можливий розмір початкової купи з кокосами, зібраної протягом дня для N моряків. Зверніть увагу: Звичайно, у світі розповідаються казки про збирання будь-якої кількості кокосових горіхів за день і множинні поділи купи, тощо, можуть виникнути у час, який відповідає сюжетній лінії, щоб таким чином не впливати на математику. Подивіться також:

--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;
}