* fix(curriculum): tests quotes * fix(curriculum): fill seed-teardown * fix(curriculum): fix tests and remove unneeded seed-teardown
		
			
				
	
	
		
			149 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: 'Sailors, coconuts and a monkey problem'
 | |
| id: 59da22823d04c95919d46269
 | |
| challengeType: 5
 | |
| ---
 | |
| 
 | |
| ## Description
 | |
| <section id='description'>
 | |
|  <p>
 | |
|    Five sailors are shipwrecked on an island and
 | |
|    collect a large pile of coconuts during the day.
 | |
|  </p>
 | |
|  <p>That night the first sailor wakes up and decides
 | |
|    to take his first share early  so tries to divide the pile of coconuts equally
 | |
|    into five piles but finds that there is one coconut left over, so he tosses it
 | |
|    to a monkey and then hides "his" one of the five equally sized piles of
 | |
|    coconuts and pushes the other four piles together to form a single visible pile
 | |
|    of coconuts again and goes to bed.
 | |
|  </p>
 | |
|  <p>
 | |
|    To cut a long story short, each of the sailors in
 | |
|    turn gets up once during the night and performs the same actions of dividing
 | |
|    the coconut pile into five, finding that one coconut is left over and giving
 | |
|    that single remainder coconut to the monkey.
 | |
|  </p>
 | |
|  <p>
 | |
|    In the morning (after the surreptitious and
 | |
|    separate action of each of the five sailors during the night), the remaining
 | |
|    coconuts are divided into five equal piles for each of the sailors, whereupon
 | |
|    it is found that the pile of coconuts divides equally amongst the sailors with
 | |
|    no remainder. (Nothing for the monkey in the morning.)
 | |
|  </p>
 | |
| 
 | |
|  The task:
 | |
| 
 | |
| 
 | |
|      Create a function that returns the
 | |
|      the minimum possible size
 | |
|      of the initial pile of coconuts collected during the day for N
 | |
|      sailors.
 | |
| 
 | |
| 
 | |
|  Note:
 | |
| 
 | |
| 
 | |
|      Of course the tale is told in a
 | |
|      world where the collection of any amount of coconuts in a day and multiple
 | |
|      divisions of the pile, etc can occur in time fitting the story line, so as
 | |
|      not to affect the mathematics.
 | |
| 
 | |
| 
 | |
| 
 | |
|  C.f:
 | |
| 
 | |
|    <a
 | |
|        href="https://www.youtube.com/watch?v=U9qU20VmvaU" title="link: https://www.youtube.com/watch?v=U9qU20VmvaU">
 | |
|        Monkeys and Coconuts - Numberphile</a> (Video) Analytical solution.
 | |
| 
 | |
| 
 | |
|      <a
 | |
|        href="http://oeis.org/A002021" title="link: http://oeis.org/A002021">A002021 Pile of coconuts problem</a> The On-Line
 | |
|      Encyclopedia of Integer Sequences. (Although some of its references may use
 | |
|      the alternate form of the tale).
 | |
| 
 | |
| 
 | |
| 
 | |
| </section>
 | |
| 
 | |
| ## Instructions
 | |
| <section id='instructions'>
 | |
| 
 | |
| </section>
 | |
| 
 | |
| ## Tests
 | |
| <section id='tests'>
 | |
| 
 | |
| ```yml
 | |
| tests:
 | |
|   - text: <code>splitCoconuts</code> is a function.
 | |
|     testString: assert(typeof splitCoconuts === 'function', '<code>splitCoconuts</code> is a function.');
 | |
|   - text: <code>splitCoconuts(5)</code> should return 3121.
 | |
|     testString: assert(splitCoconuts(5) === 3121, '<code>splitCoconuts(5)</code> should return 3121.');
 | |
|   - text: <code>splitCoconuts(6)</code> should return 233275.
 | |
|     testString: assert(splitCoconuts(6) === 233275, '<code>splitCoconuts(6)</code> should return 233275.');
 | |
|   - text: <code>splitCoconuts(7)</code> should return 823537.
 | |
|     testString: assert(splitCoconuts(7) === 823537, '<code>splitCoconuts(7)</code> should return 823537.');
 | |
| 
 | |
| ```
 | |
| 
 | |
| </section>
 | |
| 
 | |
| ## Challenge Seed
 | |
| <section id='challengeSeed'>
 | |
| 
 | |
| <div id='js-seed'>
 | |
| 
 | |
| ```js
 | |
| // noprotect
 | |
| function splitCoconuts(intSailors) {
 | |
|   // Good luck!
 | |
|   return true;
 | |
| }
 | |
| ```
 | |
| 
 | |
| </div>
 | |
| 
 | |
| 
 | |
| 
 | |
| </section>
 | |
| 
 | |
| ## Solution
 | |
| <section id='solution'>
 | |
| 
 | |
| 
 | |
| ```js
 | |
| // noprotect
 | |
| 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;
 | |
| }
 | |
| 
 | |
| ```
 | |
| 
 | |
| </section>
 |