Special factorials: Difference between revisions

Added Wren
m (Add related tasks)
(Added Wren)
Line 107:
rf(3628800) = 10
rf(119) = f
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-big}}
{{libheader|Wren-fmt}}
We've little choice but to use BigInt here as Wren can only deal natively with integers up to 2^53.
<lang ecmascript>import "/big" for BigInt
import "/fmt" for Fmt
 
var f = Fn.new { |n|
if (n < 2) return BigInt.one
var fact = BigInt.one
for (i in 2..n) fact = fact * i
return fact
}
 
var sf = Fn.new { |n|
if (n < 2) return BigInt.one
var sfact = BigInt.one
for (i in 2..n) sfact = sfact * f.call(i)
return sfact
}
 
var H = Fn.new { |n|
if (n < 2) return BigInt.one
var hfact = BigInt.one
for (i in 2..n) hfact = hfact * BigInt.new(i).pow(i)
return hfact
}
 
var af = Fn.new { |n|
if (n < 1) return BigInt.zero
var afact = BigInt.zero
var sign = (n%2 == 0) ? -1 : 1
for (i in 1..n) {
afact = afact + f.call(i) * sign
sign = -sign
}
return afact
}
 
var ef // recursive
ef = Fn.new { |n|
if (n < 1) return BigInt.one
return BigInt.new(n).pow(ef.call(n-1))
}
 
var rf = Fn.new { |n|
var i = 0
while (true) {
var fact = f.call(i)
if (fact == n) return i
if (fact > n) return "none"
i = i + 1
}
}
 
System.print("First 10 superfactorials:")
for (i in 0..9) System.print(sf.call(i))
 
System.print("\nFirst 10 hyperfactorials:")
for (i in 0..9) System.print(H.call(i))
 
System.print("\nFirst 10 alternating factorials:")
for (i in 0..9) System.write("%(af.call(i)) ")
 
System.print("\n\nFirst 5 exponential factorials:")
for (i in 0..4) System.write("%(ef.call(i)) ")
System.print()
 
Fmt.print("\nThe number of digits in 5$$ is $,d\n", ef.call(5).toString.count)
 
System.print("Reverse factorials:")
var facts = [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 119]
for (fact in facts) Fmt.print("$4s <- rf($d)", rf.call(fact), fact)</lang>
 
{{out}}
<pre>First 10 superfactorials:
1
1
2
12
288
34560
24883200
125411328000
5056584744960000
1834933472251084800000
 
First 10 hyperfactorials:
1
1
4
108
27648
86400000
4031078400000
3319766398771200000
55696437941726556979200000
21577941222941856209168026828800000
 
First 10 alternating factorials:
0 1 1 5 19 101 619 4421 35899 326981
 
First 5 exponential factorials:
1 1 2 9 262144
 
The number of digits in 5$ is 183,231
 
Reverse factorials:
0 <- rf(1)
2 <- rf(2)
3 <- rf(6)
4 <- rf(24)
5 <- rf(120)
6 <- rf(720)
7 <- rf(5040)
8 <- rf(40320)
9 <- rf(362880)
10 <- rf(3628800)
none <- rf(119)
</pre>
9,485

edits