Left factorials: Difference between revisions

Content added Content deleted
m (→‎{{header|Sidef}}: minor code updates)
Line 3,208: Line 3,208:


=={{header|Sidef}}==
=={{header|Sidef}}==
Built-in:
<lang ruby>say 20.of { .left_factorial }</lang>

Straightforward:
Straightforward:
<lang ruby>func left_fact(k) {
<lang ruby>func left_factorial(n) {
^k -> map {|n| n! } -> sum
^n -> sum { _! }
}</lang>
}</lang>


Memory efficient with ''Range.reduce()'':
Alternatively, using ''Range.reduce()'':
<lang ruby>func left_fact(k) {
<lang ruby>func left_factorial(n) {
^k -> reduce({ |a,b| a + b! }, 0)
^n -> reduce({ |a,b| a + b! }, 0)
}</lang>
}</lang>


A much faster approach:
A faster approach:
<lang ruby>func left_fact(n) {
<lang ruby>func left_factorial(n) {
static cached = 0
static cached = 0
static factorial = 1
static factorial = 1
static leftfact = 0
static leftfact = 0

 
if (n < cached) {
if (n < cached) {
cached = 0
cached = 0
Line 3,229: Line 3,232:
leftfact = 0
leftfact = 0
}
}

 
while (n > cached) {
while (n > cached) {
leftfact += factorial
leftfact += factorial
factorial *= ++cached
factorial *= ++cached
}
}

 
leftfact
leftfact
}</lang>
}</lang>


Completing the task:
Completing the task:
<lang ruby>for i (0..10, 20..110 `by` 10) {
<lang ruby>for n in (0..10, 20..110 `by` 10) {
printf("!%d = %s\n", i, left_fact(i))
printf("!%d = %s\n", n, left_factorial(n))
}
}


for i (1000..10000 `by` 1000) {
for n in (1000..10000 `by` 1000) {
printf("!%d has %d digits.\n", i, left_fact(i).len)
printf("!%d has %d digits.\n", n, left_factorial(n).len)
}</lang>
}</lang>