Added additional solutions to problem 31.

This commit is contained in:
2018-10-17 23:20:33 -04:00
parent c34ebd6181
commit 1444f7cc7e
2 changed files with 320 additions and 71 deletions

View File

@@ -11814,48 +11814,51 @@ div#notebook {
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [2]:</div>
<div class="prompt input_prompt">In [8]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">math</span> <span class="k">import</span> <span class="n">ceil</span>
<span class="n">r</span> <span class="o">=</span> <span class="mi">200</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">calculate</span><span class="p">():</span>
<span class="n">r</span> <span class="o">=</span> <span class="mi">200</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">%</span> <span class="mi">200</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p200</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r</span> <span class="o">/</span> <span class="mi">200</span><span class="p">)):</span>
<span class="n">r200</span> <span class="o">=</span> <span class="n">r</span> <span class="o">-</span> <span class="n">p200</span> <span class="o">*</span> <span class="mi">200</span>
<span class="k">if</span> <span class="n">r200</span> <span class="o">%</span> <span class="mi">100</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">if</span> <span class="n">r</span> <span class="o">%</span> <span class="mi">200</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p100</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r200</span> <span class="o">/</span> <span class="mi">100</span><span class="p">)):</span>
<span class="n">r100</span> <span class="o">=</span> <span class="n">r200</span> <span class="o">-</span> <span class="n">p100</span> <span class="o">*</span> <span class="mi">100</span>
<span class="k">if</span> <span class="n">r100</span> <span class="o">%</span> <span class="mi">50</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">p200</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r</span> <span class="o">/</span> <span class="mi">200</span><span class="p">)):</span>
<span class="n">r200</span> <span class="o">=</span> <span class="n">r</span> <span class="o">-</span> <span class="n">p200</span> <span class="o">*</span> <span class="mi">200</span>
<span class="k">if</span> <span class="n">r200</span> <span class="o">%</span> <span class="mi">100</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p50</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r100</span> <span class="o">/</span> <span class="mi">50</span><span class="p">)):</span>
<span class="n">r50</span> <span class="o">=</span> <span class="n">r100</span> <span class="o">-</span> <span class="n">p50</span> <span class="o">*</span> <span class="mi">50</span>
<span class="k">if</span> <span class="n">r50</span> <span class="o">%</span> <span class="mi">20</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">p100</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r200</span> <span class="o">/</span> <span class="mi">100</span><span class="p">)):</span>
<span class="n">r100</span> <span class="o">=</span> <span class="n">r200</span> <span class="o">-</span> <span class="n">p100</span> <span class="o">*</span> <span class="mi">100</span>
<span class="k">if</span> <span class="n">r100</span> <span class="o">%</span> <span class="mi">50</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p20</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r50</span> <span class="o">/</span> <span class="mi">20</span><span class="p">)):</span>
<span class="n">r20</span> <span class="o">=</span> <span class="n">r50</span> <span class="o">-</span> <span class="n">p20</span> <span class="o">*</span> <span class="mi">20</span>
<span class="k">if</span> <span class="n">r20</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">r20</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">p50</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r100</span> <span class="o">/</span> <span class="mi">50</span><span class="p">)):</span>
<span class="n">r50</span> <span class="o">=</span> <span class="n">r100</span> <span class="o">-</span> <span class="n">p50</span> <span class="o">*</span> <span class="mi">50</span>
<span class="k">if</span> <span class="n">r50</span> <span class="o">%</span> <span class="mi">20</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p10</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r20</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)):</span>
<span class="n">r10</span> <span class="o">=</span> <span class="n">r20</span> <span class="o">-</span> <span class="n">p10</span> <span class="o">*</span> <span class="mi">10</span>
<span class="k">if</span> <span class="n">r10</span> <span class="o">%</span> <span class="mi">5</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">p20</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r50</span> <span class="o">/</span> <span class="mi">20</span><span class="p">)):</span>
<span class="n">r20</span> <span class="o">=</span> <span class="n">r50</span> <span class="o">-</span> <span class="n">p20</span> <span class="o">*</span> <span class="mi">20</span>
<span class="k">if</span> <span class="n">r20</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">r20</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p5</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r10</span> <span class="o">/</span> <span class="mi">5</span><span class="p">)):</span>
<span class="n">r5</span> <span class="o">=</span> <span class="n">r10</span> <span class="o">-</span> <span class="n">p5</span> <span class="o">*</span> <span class="mi">5</span>
<span class="k">if</span> <span class="n">r5</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">p10</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r20</span> <span class="o">/</span> <span class="mi">10</span><span class="p">)):</span>
<span class="n">r10</span> <span class="o">=</span> <span class="n">r20</span> <span class="o">-</span> <span class="n">p10</span> <span class="o">*</span> <span class="mi">10</span>
<span class="k">if</span> <span class="n">r10</span> <span class="o">%</span> <span class="mi">5</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p2</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r5</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)):</span>
<span class="n">r2</span> <span class="o">=</span> <span class="n">r5</span> <span class="o">-</span> <span class="n">p2</span> <span class="o">*</span> <span class="mi">2</span>
<span class="k">if</span> <span class="n">r2</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">p5</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r10</span> <span class="o">/</span> <span class="mi">5</span><span class="p">)):</span>
<span class="n">r5</span> <span class="o">=</span> <span class="n">r10</span> <span class="o">-</span> <span class="n">p5</span> <span class="o">*</span> <span class="mi">5</span>
<span class="k">if</span> <span class="n">r5</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">p2</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">r5</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)):</span>
<span class="n">r2</span> <span class="o">=</span> <span class="n">r5</span> <span class="o">-</span> <span class="n">p2</span> <span class="o">*</span> <span class="mi">2</span>
<span class="k">if</span> <span class="n">r2</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">c</span>
<span class="k">return</span> <span class="n">c</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">calculate</span><span class="p">()</span>
</pre></div>
</div>
</div>
@@ -11863,7 +11866,7 @@ div#notebook {
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [3]:</div>
<div class="prompt input_prompt">In [9]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
@@ -11884,6 +11887,140 @@ div#notebook {
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>I came up with a more concise solution that can be implemented in Scheme. I would like to compare the performance of the solutions.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [34]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">count_change</span><span class="p">(</span><span class="n">change</span><span class="p">,</span> <span class="n">coins</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">coins</span><span class="p">:</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">coin</span><span class="p">,</span> <span class="n">coins</span> <span class="o">=</span> <span class="n">coins</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">coins</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">change</span> <span class="o">//</span> <span class="n">coin</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">if</span> <span class="n">change</span> <span class="o">-</span> <span class="n">i</span> <span class="o">*</span> <span class="n">coin</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">change</span> <span class="o">-</span> <span class="n">i</span> <span class="o">*</span> <span class="n">coin</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">count</span> <span class="o">+=</span> <span class="n">count_change</span><span class="p">(</span><span class="n">change</span> <span class="o">-</span> <span class="n">i</span> <span class="o">*</span> <span class="n">coin</span><span class="p">,</span> <span class="n">coins</span><span class="p">)</span>
<span class="k">return</span> <span class="n">count</span>
<span class="k">def</span> <span class="nf">calculate_iterative</span><span class="p">():</span>
<span class="k">return</span> <span class="n">count_change</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">calculate_iterative</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>73682
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [35]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">timeit</span>
<span class="nb">print</span><span class="p">(</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="n">calculate</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="n">calculate_iterative</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>0.16300111500095227
11.429953110000497
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Turns out I was way smarter than I thought when I have developped calculate. It checks the remainder and by doing that saves a ton of iterations.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [36]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">count_change</span><span class="p">(</span><span class="n">change</span><span class="p">,</span> <span class="n">coins</span><span class="p">):</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">coin</span><span class="p">,</span> <span class="n">coins</span> <span class="o">=</span> <span class="n">coins</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">coins</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="n">change</span> <span class="o">%</span> <span class="n">coin</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">coins</span><span class="p">:</span>
<span class="k">return</span> <span class="n">count</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">ceil</span><span class="p">(</span><span class="n">change</span> <span class="o">/</span> <span class="n">coin</span><span class="p">)):</span>
<span class="n">count</span> <span class="o">+=</span> <span class="n">count_change</span><span class="p">(</span><span class="n">change</span> <span class="o">-</span> <span class="n">i</span> <span class="o">*</span> <span class="n">coin</span><span class="p">,</span> <span class="n">coins</span><span class="p">)</span>
<span class="k">return</span> <span class="n">count</span>
<span class="k">def</span> <span class="nf">calculate_iterative</span><span class="p">():</span>
<span class="k">return</span> <span class="n">count_change</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">calculate_iterative</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="n">calculate_iterative</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>73682
0.34602016500139143
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [ ]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>