Perfect numbers: Difference between revisions
Content added Content deleted
(→{{header|Vlang}}: Rename "Vlang" in "V (Vlang)") |
(add lambdatalk code) |
||
Line 2,206: | Line 2,206: | ||
=={{header|LabVIEW}}== |
=={{header|LabVIEW}}== |
||
{{VI solution|LabVIEW_Perfect_numbers.png}} |
{{VI solution|LabVIEW_Perfect_numbers.png}} |
||
=={{header|Lambdatalk}}== |
|||
===simple & slow=== |
|||
<syntaxhighlight lang="scheme"> |
|||
{def perf |
|||
{def perf.sum |
|||
{lambda {:n :sum :i} |
|||
{if {>= :i :n} |
|||
then {= :sum :n} |
|||
else {perf.sum :n |
|||
{if {= {% :n :i} 0} |
|||
then {+ :sum :i} |
|||
else :sum} |
|||
{+ :i 1}} }}} |
|||
{lambda {:n} |
|||
{perf.sum :n 0 2} }} |
|||
-> perf |
|||
{S.replace \s by space in |
|||
{S.map {lambda {:i} {if {perf :i} then :i else}} |
|||
{S.serie 2 1000 2}}} |
|||
-> 6 28 496 // 5200ms |
|||
</syntaxhighlight> |
|||
Too slow (and stackoverflow) to go further. |
|||
===improved=== |
|||
<syntaxhighlight lang="scheme"> |
|||
{def lt_perfect |
|||
{def lt_perfect.sum |
|||
{lambda {:n :sum :i} |
|||
{if {> :i 1} |
|||
then {lt_perfect.sum :n |
|||
{if {= {% :n :i} 0} |
|||
then {+ :sum :i {floor {/ :n :i}}} |
|||
else :sum} |
|||
{- :i 1}} |
|||
else :sum }}} |
|||
{lambda {:n} |
|||
{let { {:n :n} |
|||
{:sqrt {floor {sqrt :n}}} |
|||
{:sum {lt_perfect.sum :n 1 {- {floor {sqrt :n}} 0} }} |
|||
{:foo {if {= {* :sqrt :sqrt} :n} |
|||
then 0 |
|||
else {floor {/ :n :sqrt}}}} |
|||
} {= :n {if {= {% :n :sqrt} 0} |
|||
then {+ :sum :sqrt :foo} |
|||
else :sum}} }}} |
|||
-> lt_perfect |
|||
-> {S.replace \s by space in |
|||
{S.map {lambda {:i} {if {lt_perfect :i} then :i else}} |
|||
{S.serie 6 10000 2}}} |
|||
-> 28 496 8128 // 7500ms |
|||
</syntaxhighlight> |
|||
===calling javascript=== |
|||
Following the javascript entry. |
|||
<syntaxhighlight lang="scheme"> |
|||
function js_perfect(n) { |
|||
var sum = 1, i, sqrt=Math.floor(Math.sqrt(n)); |
|||
for (i = sqrt-1; i>1; i--) { |
|||
if (n % i == 0) |
|||
sum += i + n/i; |
|||
} |
|||
if(n % sqrt == 0) |
|||
sum += sqrt + (sqrt*sqrt == n ? 0 : n/sqrt); |
|||
return sum === n; |
|||
} |
|||
{S.replace \s by space in |
|||
{S.map {lambda {:i} {if {js_perfect :i} then :i else}} |
|||
{S.serie 2 10000}}} |
|||
-> 6 28 496 8128 // 80ms |
|||
</syntaxhighlight> |
|||
=={{header|Lasso}}== |
=={{header|Lasso}}== |