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

2.8 KiB

id title challengeType forumTopicId dashedName
59da22823d04c95919d46269 Problema dos marinheiros, dos cocos e do macaco 5 302304 sailors-coconuts-and-a-monkey-problem

--description--

Cinco marinheiros são náufragos em uma ilha e coletam muitos cocos durante o dia.

Naquela noite, o primeiro marinheiro acorda e decide tomar a sua parte dos cocos mais cedo, então tenta dividir o monte de cocos igualmente em cinco pilhas, mas descobre que ainda há um coco sobrando. Então, ele o joga para um macaco e então esconde "sua" pilha, uma das cinco pilhas de cocos de tamanho igual, e empurra os outros quatro montes para formar um único monte visível de cocos novamente e vai para a cama.

Resumindo uma longa história, cada marinheiro por sua vez se levanta uma vez durante a noite e executa as mesmas ações de dividir a pilha de cocos em cinco, descobrindo que sobra um coco e deixando o coco que resta para o macaco e unindo as outras quatro pilhas em uma única pilha.

De manhã (depois da ação às escondidas e separada de cada um dos cinco marinheiros durante a noite), os cocos restantes são divididos em cinco pilhas iguais para cada um dos marinheiros, onde se descobre que a pilha de cocos pode ser dividida igualmente entre os marinheiros, sem sobrar nenhum. (Nada é dado para o macaco da manhã.)

--instructions--

Crie uma função que retorne o tamanho mínimo possível para a pilha inicial de cocos coletados durante o dia para N marinheiros. Observação: logicamente, a história é contada em um mundo onde a coleção de qualquer quantidade de cocos em um dia e múltiplas divisões do monte pode ocorrer em tempo ajustando a linha da história, de modo a não afetar a matemática.

--hints--

splitCoconuts deve ser uma função.

assert(typeof splitCoconuts === 'function');

splitCoconuts(5) deve retornar 3121.

assert(splitCoconuts(5) === 3121);

splitCoconuts(6) deve retornar 233275.

assert(splitCoconuts(6) === 233275);

splitCoconuts(7) deve retornar 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;
}