Man or boy test: Difference between revisions
Content added Content deleted
(→{{header|Go}}: Don't think Sonia ever intended the 'faster' version to work for k < 6 but I've modified it now so it does.) |
(→{{header|Wren}}: Added GMP version.) |
||
Line 3,681: | Line 3,681: | ||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
===CLI=== |
|||
In Wren, a fiber's stack starts quite small but is then increased as needed, apparently limited only by available memory. Anyway, satisfying the test for k up to 20 is unlikely to be a problem on a modern machine. |
In Wren, a fiber's stack starts quite small but is then increased as needed, apparently limited only by available memory. Anyway, satisfying the test for k up to 20 is unlikely to be a problem on a modern machine. |
||
<lang ecmascript>import "/fmt" for Fmt |
<lang ecmascript>import "/fmt" for Fmt |
||
Line 3,723: | Line 3,724: | ||
19 : -78985 |
19 : -78985 |
||
20 : -175416 |
20 : -175416 |
||
</pre> |
|||
===Embedded (GMP)=== |
|||
{{libheader|Wren-gmp}} |
|||
{{libheader|Wren-fmt}} |
|||
Based on Go's 'faster' version this runs in about 15.2 seconds which (surprisingly) is slightly faster than Go itself (16.6 seconds). |
|||
<lang ecmascript>/* man_or_boy_test_gmp.wren */ |
|||
import "./gmp" for Mpz |
|||
import "./fmt" for Fmt |
|||
var A = Fn.new { |k| |
|||
if (k < 6) { |
|||
var x1 = 1 |
|||
var x2 = -1 |
|||
var x3 = -1 |
|||
var x4 = 1 |
|||
var c1 = [0, 0, 0, 1, 2, 3][k] |
|||
var c2 = [0, 0, 1, 1, 1, 2][k] |
|||
var c3 = [0, 1, 1, 0, 0, 1][k] |
|||
var c4 = [1, 1, 0, 0, 0, 0][k] |
|||
return c1*x1 + c2*x2 + c3*x3 + c4*x4 |
|||
} |
|||
var one = Mpz.one |
|||
var c0 = Mpz.three |
|||
var c1 = Mpz.two |
|||
var c2 = Mpz.one |
|||
var c3 = Mpz.zero |
|||
for (j in 5...k) { |
|||
c3.add(c0).sub(one) |
|||
c0.add(c1) |
|||
c1.add(c2) |
|||
c2.add(c3) |
|||
} |
|||
return c0.add(c0.sub(c0.sub(c1), c2), c3) |
|||
} |
|||
var p = Fn.new { |k| |
|||
Fmt.write("A($d) = ", k) |
|||
var s = A.call(k).toString |
|||
if (s.count < 60) { |
|||
System.print(s) |
|||
} else { |
|||
Fmt.print("$s...$s ($d digits)", s[0..5], s[-5..-1], s.count - 1) |
|||
} |
|||
} |
|||
for (i in 0..39) p.call(i) |
|||
p.call(500) |
|||
p.call(10000) |
|||
p.call(1e6) </lang> |
|||
{{out}} |
|||
<pre> |
|||
Same as Go 'faster' version. |
|||
</pre> |
</pre> |
||