Practical numbers: Difference between revisions

Content added Content deleted
(→‎{{header|Phix}}: replaced with translation of python)
Line 19:
 
=={{header|Phix}}==
{{trans|Python|(the composition of functions version)}}
<!--<lang Phix>-->
<span style="color: #004080008080;">atomfunction</span> <span style="color: #000000;">t0sum_of_any_subset</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #7060A8000000;">timef</span><span style="color: #0000FF;">()</span>
<span style="color: #000080;font-style:italic;">-- return true if any subset of f sums to n.</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">sumset</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">set</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">tot</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">done</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #0000007060A8;">totfind</span><span style="color: #0000FF;"><(</span><span style="color: #7060A8000000;">lengthn</span><span style="color: #0000FF;">(,</span><span style="color: #000000;">resf</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080004080;">ifinteger</span> <span style="color: #000000;">tottotal</span> <span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #0080807060A8;">and</span> <span style="color: #000000;">ressum</span><span style="color: #0000FF;">[(</span><span style="color: #000000;">totf</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">resn</span><span style="color: #0000FF;">[=</span><span style="color: #000000;">tottotal</span> <span style="color: #0000FF008080;">]then</span> <span style="color: #0000FF008080;">=return</span> <span style="color: #000000004600;">1true</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">></span><span style="color: #000000;">restotal</span> <span style="color: #0000FF008080;">[$]then</span> <span style="color: #0000FF008080;">+return</span> <span style="color: #004600;">false</span> <span style="color: #000000008080;">end</span> <span style="color: #008080;">1if</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">d</span> <span style="color: #0080800000FF;">end=</span> <span style="color: #008080000000;">n</span><span style="color: #0000FF;">-</span><span style="color: #000000;">f</span><span style="color: #0000FF;">if[$]</span>
<span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">donef</span> <span style="color: #0000FF;">+[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">ifreturn</span> <span style="color: #000000;">done</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">lengthfind</span><span style="color: #0000FF;">(</span><span style="color: #000000;">setd</span><span style="color: #0000FF;">),</span> <span style="color: #008080;">and</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">[$]<</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">resf</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000008080;">resor</span> <span style="color: #0000FF;">=(</span> <span style="color: #000000;">sumsetd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">set0</span><span style="color: #0000FF;">,</span><span style="color: #000000008080;">totand</span><span style="color: #0000FF;">+</span><span style="color: #000000;">setsum_of_any_subset</span><span style="color: #0000FF;">[(</span><span style="color: #000000;">doned</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">donef</span><span style="color: #0000FF;">))</span>
<span style="color: #000000008080;">res</span> <span style="color: #0000FF;">=or</span> <span style="color: #000000;">sumsetsum_of_any_subset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">resn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">set</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tot</span><span style="color: #0000FF;">,</span><span style="color: #000000;">donef</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">iffunction</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">is_practical</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080004080;">returnsequence</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sumset</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">factors</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)))</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">sumset</span> <span style="color: #0000FF008080;">(if</span> <span style="color: #004080008080;">sequencenot</span> <span style="color: #000000;">ressum_of_any_subset</span><span style="color: #0000FF;">,(</span> <span style="color: #000000;">seti</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">totf</span><span style="color: #0000FF;">=)</span> <span style="color: #000000008080;">0then</span> <span style="color: #0000FF008080;">,return</span> <span style="color: #000000004600;">donefalse</span> <span style="color: #0000FF008080;">=end</span><span style="color: #000000;">0</span><span style="color: #0000FF008080;">)if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">iffor</span>
<span style="color: #008080;">return</span> <span style="color: #000000004600;">restrue</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
Line 44 ⟶ 46:
<span style="color: #008080;">procedure</span> <span style="color: #000000;">stretch</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"is_practical(%d):%t (%s)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">is_practical</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">elapsed</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">)})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">({</span><span style="color: #000000;">666</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6666</span><span style="color: #0000FF;">,</span><span style="color: #000000;">66666</span><span style="color: #0000FF;">,</span><span style="color: #000000;">672</span><span style="color: #0000FF;">,</span><span style="color: #000000;">720</span><span style="color: #0000FF;">},</span><span style="color: #000000;">stretch</span><span style="color: #0000FF;">)</span>
Line 50 ⟶ 52:
{{out}}
<pre>
Found 7677 practical numbers:
1, 2, 4, 6, 8, 12, 16, 18, 20, 24, 28, ..., 288, 294, 300, 304, 306, 308, 312, 320, 324, 330
 
is_practical(666):true (0.3s)
is_practical(6666):true (0.3s)
is_practical(66666):false (0.3s)
is_practical(672):true (1.5s)
is_practical(720):true (1 minute and 7s)
</pre>