Left factorials: Difference between revisions

m
syntax highlighting fixup automation
m (→‎{{header|R}}: Syntax highlighting.)
m (syntax highlighting fixup automation)
Line 49:
{{trans|D}}
 
<langsyntaxhighlight lang="11l">F left_fact(n)
BigInt result = 0
BigInt factorial = 1
Line 63:
print(left_fact(i))
print("\nDigits in 1,000 through 10,000 by thousands:")
print((1000..10000).step(1000).map(i -> String(left_fact(i)).len))</langsyntaxhighlight>
 
{{out}}
Line 89:
Uses the Algol 68G LONG LONG INT type which has programmer definable precision.
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}}
<langsyntaxhighlight lang="algol68"># set the precision of LONG LONG INT - large enough for !n up to ! 10 000 #
PR precision 36000 PR
# stores left factorials in an array #
Line 156:
OD
END
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 197:
=={{header|AWK}}==
Old posix AWK doesn't support computing with large numbers. However modern gawk can use GMP if the flag -M is used.
<syntaxhighlight lang="awk">
<lang AWK>
#!/usr/bin/gawk -Mf
function left_factorial(num) {
Line 221:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 260:
{{works with|BBC BASIC for Windows}}
Use the 'Mapm' library.
<langsyntaxhighlight lang="bbcbasic"> INSTALL @lib$+"BB4WMAPMLIB" : PROCMAPM_Init : MAPM_Dec%=200
 
Result$="0" : A$="1"
Line 270:
IF I% > 999 IF I% MOD 1000 = 0 PRINT "!";I% " has " LENFNMAPM_FormatDec(Result$,0) " digits"
NEXT
END</langsyntaxhighlight>
{{out}}
<pre>
Line 307:
=={{header|Bracmat}}==
{{trans|D}}
<langsyntaxhighlight lang="bracmat">( ( leftFact
= result factorial i
. 0:?result
Line 343:
. (=L.@(!arg:? [?L)&out$!L)
)
)</langsyntaxhighlight>
{{out}}
<pre>First 11 left factorials:
Line 384:
=={{header|C}}==
{{libheader|GMP}}
<syntaxhighlight lang="c">
<lang C>
#include <stdio.h>
#include <stdlib.h>
Line 435:
return 0;
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 472:
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">
using System;
using System.Numerics;
Line 525:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 563:
Faster Implementation
 
<langsyntaxhighlight lang="csharp">
using System;
using System.Numerics;
Line 614:
}
}
</syntaxhighlight>
</lang>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">
<lang CPP>
#include <vector>
#include <string>
Line 745:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 783:
===Faster alternative===
{{libheader|GMP}}
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <gmpxx.h>
 
Line 820:
}
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 861:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="lisp">(ns left-factorial
(:gen-class))
 
Line 880:
(doseq [n (range 1000 10001 1000)]
(println (format "!%-5d has %5d digits" n (count (str (biginteger (left-factorial n)))))))
</syntaxhighlight>
</lang>
{{Output}}
<pre>
Line 917:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">
(defun fact (n)
(reduce #'* (loop for i from 1 to n collect i)))
Line 930:
(format t "1000 -> 10000 by 1000~&")
(format t "~{~a digits~&~}" (loop for i from 1000 upto 10000 by 1000 collect (length (format nil "~a" (left-fac i)))))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 960:
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.bigint, std.range, std.algorithm, std.conv;
 
BigInt leftFact(in uint n) pure nothrow /*@safe*/ {
Line 977:
writefln("\nDigits in 1,000 through 10,000 by thousands:\n%s",
iota(1_000, 10_001, 1_000).map!(i => i.leftFact.text.length));
}</langsyntaxhighlight>
{{out}}
<pre>First 11 left factorials:
Line 999:
=={{header|EchoLisp}}==
We use the 'bigint' library and memoization : (remember 'function).
<langsyntaxhighlight lang="lisp">
(lib 'bigint)
(define (!n n)
Line 1,005:
(+ (!n (1- n)) (factorial (1- n)))))
(remember '!n)
</syntaxhighlight>
</lang>
Output:
<langsyntaxhighlight lang="lisp">
(for ((n 11)) (printf "!n(%d) = %d" n (!n n)))
(for ((n (in-range 20 120 10))) (printf "!n(%d) = %d" n (!n n)))
Line 1,046:
Digits of !n(9000) = 31678
Digits of !n(10000) = 35656
</syntaxhighlight>
</lang>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule LeftFactorial do
def calc(0), do: 0
def calc(n) do
Line 1,068:
digits = LeftFactorial.calc(i) |> to_char_list |> length
IO.puts "!#{i} has #{digits} digits"
end)</langsyntaxhighlight>
 
{{out}}
Line 1,107:
=={{header|F_Sharp|F#}}==
===The Functıon===
<langsyntaxhighlight lang="fsharp">
// Generate Sequence of Left Factorials: Nigel Galloway, March 5th., 2019.
let LF=Seq.unfold(fun (Σ,n,g)->Some(Σ,(Σ+n,n*g,g+1I))) (0I,1I,1I)
</syntaxhighlight>
</lang>
===The Tasks===
;Display LF 0..10
<langsyntaxhighlight lang="fsharp">
LF |> Seq.take 11|>Seq.iter(printfn "%A")
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,131:
</pre>
;Display LF 20..110 in steps of 10
<langsyntaxhighlight lang="fsharp">
LF |> Seq.skip 20 |> Seq.take 91 |> Seq.iteri(fun n g->if n%10=0 then printfn "%A" g)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,148:
</pre>
;Display the length (in decimal digits) of LF 1000 .. 10000 in steps of 1000
<langsyntaxhighlight lang="fsharp">
LF |> Seq.skip 1000 |> Seq.take 9001 |> Seq.iteri(fun n g->if n%1000=0 then printfn "%d" (string g).Length)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,167:
=={{header|Factor}}==
{{works with|Factor|0.98}}
<syntaxhighlight lang="text">USING: formatting fry io kernel math math.factorials
math.functions math.parser math.ranges sequences ;
IN: rosetta-code.left-factorials
Line 1,193:
: main ( -- ) part1 part2 part3 ;
 
MAIN: main</langsyntaxhighlight>
{{out}}
<pre>
Line 1,235:
{{works with|Gforth 0.7.3}}
This solution inspired by the Fortran one.
<langsyntaxhighlight Forthlang="forth">36000 CONSTANT #DIGITS \ Enough for !10000
CREATE S #DIGITS ALLOT S #DIGITS ERASE VARIABLE S#
CREATE F #DIGITS ALLOT F #DIGITS ERASE VARIABLE F#
Line 1,282:
dup REPORT
dup F F# @ rot B* F# !
1+ REPEAT drop ;</langsyntaxhighlight>
{{out}}
<pre>$ gforth left-factorials.fs -e 'GO bye'
Line 1,324:
Because this calculation won't get far, no attempt is made to save intermediate results (such as the factorial numbers) nor develop the results progressively even though they are to be produced in sequence. Each result is computed from the start, as per the specified formulae.
 
For output, to have the exclamation mark precede the number without a gap, format sequence <code>"!",I0</code> will do, the <code>I0</code> format code being standardised in F90. However, this produces varying-length digit sequences, which will mean that the following output changes position likewise. Rather than use say <code>I20</code> for the result and have a wide gap, code <code>I0</code> will do, and to start each such number in the same place, the code <code>T6</code> will start it in column six, far enough along not to clash with the first number on the line, given that it will not be large. <langsyntaxhighlight Fortranlang="fortran"> MODULE LAIROTCAF !Calculates "left factorials".
CONTAINS !The usual suspects.
INTEGER*8 FUNCTION FACT(N) !Factorial, the ordinary.
Line 1,361:
WRITE (6,1) I,LFACT(I)
END DO
END</langsyntaxhighlight>
 
Output:
Line 1,382:
</pre>
 
Obviously, one could proceed using the services of some collection of "bignum" routines, and then the code would merely depict their uses for this problem. Since the task is to produce consecutive values, all that need be done is to maintain a S value holding the accumulated sum, and a F value for the successive factorials to be added into S. The only difficulty is to arrange the proper phasing of the starting values so that the calculation will work. Since only one multiply and one addition is needed per step, explicit code might as well be used, as follows: <langsyntaxhighlight Fortranlang="fortran">Calculates "left factorials", in sequence, and shows some.
INTEGER ENUFF,BASE !Some parameters.
PARAMETER (BASE = 10, ENUFF = 40000) !This should do.
Line 1,448:
END DO !If there is one, as when N > BASE.
END DO !On to the next result.
END !Ends with a new factorial that won't be used.</langsyntaxhighlight>
Output: achieved in a few seconds. A larger BASE would give a faster calculation, but would complicate the digit count.
<pre>
Line 1,487:
{{trans|C}}
{{libheader|GMP}}
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
#include "gmp.bi"
Line 1,529:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 1,578:
Frink contains efficient algorithms for calculating and caching factorials and this program will work for arbitrarily-large numbers.
 
<langsyntaxhighlight lang="frink">leftFactorial[n] :=
{
sum = 0
Line 1,597:
println["\nlength of 1000 through 10000"]
for n = 1000 to 10000 step 1000
println["$n has " + length[toString[leftFactorial[n]]] + " digits"]</langsyntaxhighlight>
{{out}}
<pre>
Line 1,639:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,683:
}
fmt.Println()
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,702:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">leftFact :: [Integer]
leftFact = scanl (+) 0 fact
 
Line 1,721:
, show $ length . show . (leftFact !!) <$> [1000,2000 .. 10000]
, ""
]</langsyntaxhighlight>
{{Out}}
<pre>0 ~ 10:
Line 1,745:
{{trans|D}}
The following works in both languages:
<syntaxhighlight lang="text">procedure main()
every writes(lfact(0 | !10)," ")
write()
Line 1,760:
every (i := !n, r +:= .f, f *:= .i)
return r
end</langsyntaxhighlight>
 
{{out}}
Line 1,786:
This could be made more efficient (in terms of machine time), is there a practical application for this? The more efficient machine approach would require a more specialized interface or memory dedicated to caching.
 
<langsyntaxhighlight Jlang="j">leftFact=: +/@:!@i."0</langsyntaxhighlight>
 
Task examples:
 
<langsyntaxhighlight Jlang="j"> (,. leftFact) i.11
0 0
1 1
Line 1,823:
8000 27749
9000 31678
10000 35656</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.math.BigInteger;
 
public class LeftFac{
Line 1,858:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>!0 = 0
Line 1,897:
 
'''Using builtin arithmetic''':
<langsyntaxhighlight lang="jq">def left_factorial:
reduce range(1; .+1) as $i
# state: [i!, !i]
([1,0]; .[1] += .[0] | .[0] *= $i)
| .[1];</langsyntaxhighlight>
 
'''Using BigInt.jq''':
Line 1,910:
To compute the lengths of the decimal representation without having to recompute !n,
we also define left_factorial_lengths(gap) to emit [n, ( !n|length) ] when n % gap == 0.
<langsyntaxhighlight lang="jq">import "BigInt" as BigInt;
 
# integer input
Line 1,930:
| (.[1] | tostring | length) as $lf
| if $i % gap == 0 then .[2] += [[$i, $lf]] else . end)
| .[2];</langsyntaxhighlight>
 
'''The specific tasks''':
<langsyntaxhighlight lang="sh">((range(0;11), (range(2; 12) * 10)) | "\(.): \(long_left_factorial)"),
 
(10000 | long_left_factorial_lengths(1000) | .[] | "\(.[0]): length is \(.[1])")</langsyntaxhighlight>
 
{{out}}
(scrollable)
<div style="overflow:scroll; height:200px;">
<langsyntaxhighlight lang="sh">$ jq -r -n -L . -f Long_left_factorial.jq
0: 0
1: 1
Line 1,971:
8000: length is 27749
9000: length is 31678
10000: length is 35656</langsyntaxhighlight>
</div>
 
Line 1,977:
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">leftfactorial(n::Integer) = n ≤ 0 ? zero(n) : sum(factorial, 0:n-1)
 
@show leftfactorial.(0:10)
@show ndigits.(leftfactorial.(big.(1000:1000:10_000)))</langsyntaxhighlight>
 
{{out}}
Line 1,987:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
import java.math.BigInteger
Line 2,009:
for (i in 1000..10000 step 1000)
println("!${i.toString().padEnd(5)} has ${leftFactorial(i).toString().length} digits")
}</langsyntaxhighlight>
 
{{out}}
Line 2,051:
 
The code can be tested in this wiki page: http://lambdaway.free.fr/lambdawalks/?view=left_factorial
<langsyntaxhighlight lang="scheme">
'''1) defining !n'''
 
Line 2,132:
Digits of !n(10000) = 35656
 
</syntaxhighlight>
</lang>
 
=={{header|Lua}}==
Takes about five seconds...
<langsyntaxhighlight Lualang="lua">-- Lua bindings for GNU bc
require("bc")
 
Line 2,163:
for i = 1000, 10000, 1000 do
print("!" .. i .. " contains " .. #leftFac(i) .. " digits")
end</langsyntaxhighlight>
{{out}}
<pre>!0 = 0
Line 2,198:
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">left_factorial := n -> add(k!, k = 1 .. n - 1);
seq(left_factorial(i), i = 1 .. 10);
seq(left_factorial(i), i = 20 .. 110, 10);
seq(length(left_factorial(i)), i = 1000 .. 10000, 1000);</langsyntaxhighlight>
{{out}}
<pre>0, 1, 3, 9, 33, 153, 873, 5913, 46233, 409113
Line 2,210:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">left[n_] := left[n] = Sum[k!, {k, 0, n - 1}]
Print["left factorials 0 through 10:"]
Print[left /@ Range[0, 10] // TableForm]
Line 2,216:
Print[left /@ Range[20, 110, 10] // TableForm]
Print["Digits in left factorials 1,000 through 10,000, by thousands:"]
Print[Length[IntegerDigits[left[#]]] & /@ Range[1000, 10000, 1000] // TableForm]</langsyntaxhighlight>
{{out}}
<pre>left factorials 0 through 10:
Line 2,257:
=={{header|Nim}}==
{{trans|Python}}
<langsyntaxhighlight lang="nim">import iterutils, bigints
 
proc lfact: iterator: BigInt =
Line 2,282:
echo "Digits in 1,000 through 10,000 (inclusive) by thousands:"
for i in lfact().slice(1_000, 10_000, 1_000):
echo " ", ($i).len</langsyntaxhighlight>
{{out}}
<pre>first 11:
Line 2,321:
=={{header|Oforth}}==
 
<langsyntaxhighlight Oforthlang="oforth">: leftFact | i | 0 1 rot loop: i [ tuck + swap i * ] drop ;</langsyntaxhighlight>
 
{{out}}
Line 2,349:
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">lf(n)=sum(k=0,n-1,k!);
apply(lf, [0..10])
apply(lf, 10*[2..11])
forstep(n=1000,1e4,1000,print1(#digits(lf(n))", "))</langsyntaxhighlight>
{{out}}
<pre>%1 = [0, 1, 2, 4, 10, 34, 154, 874, 5914, 46234, 409114]
Line 2,363:
If performance is a concern, this will run over 100x faster by replacing the line "use bigint" with "use Math::GMP qw/:constant/" (after installing that module).
 
<langsyntaxhighlight lang="perl">#!perl
use 5.010;
use strict;
Line 2,387:
printf "!%d has %d digits.\n", $_, length leftfact($_) for map $_*1000, 1..10;
 
</syntaxhighlight>
</lang>
 
Since I copied the printf format strings from the Raku implementation,
Line 2,395:
{{trans|Lua}}
{{libheader|Phix/mpfr}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
Line 2,426:
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1000</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10000</span> <span style="color: #008080;">by</span> <span style="color: #000000;">1000</span> <span style="color: #008080;">do</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;">"!%d contains %s digits\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)})</span> <span style="color: #008080;">end</span> <span style="color: #008080;">for</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;">"complete (%3.2fs)\n"</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>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 2,464:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de n! (N)
(cache '(NIL) N
(if (> 2 N) 1
Line 2,481:
(prinl "length of 1000 - 10000")
(pril (mapcar 'length (mapcar '!n (range 1000 10000 1000))))
</syntaxhighlight>
</lang>
{{out}}
<syntaxhighlight lang="text">0-10
1
1
Line 2,517:
31678
35656
</syntaxhighlight>
</lang>
 
=={{header|PL/I}}==
Line 2,524:
Results are shown for the first 11 integers, as required;
then for the integers from 20 through 30 only, because factorials for n = 40 and larger are not possible.
<langsyntaxhighlight lang="pli">lf: procedure (n) returns (fixed decimal (31) );
declare n fixed binary;
declare (s, f) fixed (31);
Line 2,546:
end;
 
end left_factorials;</langsyntaxhighlight>
{{out}}
<pre>
Line 2,575:
=={{header|PowerShell}}==
{{works with|PowerShell|4.0}}
<syntaxhighlight lang="powershell">
<lang PowerShell>
function left-factorial ([BigInt]$n) {
[BigInt]$k, [BigInt]$fact = ([BigInt]::Zero), ([BigInt]::One)
Line 2,602:
else {"!$i has $digits digit"}
}
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 2,644:
=={{header|Prolog}}==
{{works with|SWI Prolog}}
<langsyntaxhighlight lang="prolog">leftfact(N):-
leftfact(N, 0, 0, 1).
 
Line 2,665:
main:-
leftfact(10001).</langsyntaxhighlight>
 
{{out}}
Line 2,703:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">from itertools import islice
 
def lfact():
Line 2,717:
print(lf)
print('Digits in 1,000 through 10,000 (inclusive) by thousands:\n %r'
% [len(str(lf)) for lf in islice(lfact(), 1000, 10001, 1000)] )</langsyntaxhighlight>
 
{{out}}
Line 2,743:
 
{{Trans|Haskell}}
<langsyntaxhighlight lang="python">'''Left factorials'''
 
from itertools import (accumulate, chain, count, islice)
Line 2,834:
 
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>Terms 0 thru 10 inclusive:
Line 2,856:
=={{header|Quackery}}==
 
<langsyntaxhighlight Quackerylang="quackery"> [ 1 swap times [ i 1+ * ] ] is ! ( n --> n )
 
[ 0 swap times [ i ! + ] ] is !n ( n --> n )
Line 2,868:
say "Digits in 1,000 through 10,000 by thousands:" cr
10 times [ i^ 1+ 1000 * !n number$ size echo cr ]
cr</langsyntaxhighlight>
 
{{out}}
Line 2,901:
=={{header|R}}==
===Imperative solution===
<langsyntaxhighlight lang="rsplus">library(gmp)
 
left_factorial <- function(n) {
Line 2,932:
cat("!",n," has ",digit_count(left_factorial(n))," digits\n", sep = "")
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,968:
===Vectorization solution===
Due to vectorization, these sorts of problems are R's bread and butter. The only challenge comes from making sure that R plays nice with objects from the gmp library.
<langsyntaxhighlight lang="rsplus">library(gmp)
leftFact <- function(numbs)
{
Line 2,985:
#Task 3
inputs<-seq(1000, 10000, by = 1000)
print(data.frame(Digits = sapply(leftFact(inputs), nchar), row.names = paste0("!", inputs)))</langsyntaxhighlight>
 
{{out}}
Line 3,030:
=={{header|Racket}}==
 
<langsyntaxhighlight lang="racket">#lang racket
(define ! (let ((rv# (make-hash))) (λ (n) (hash-ref! rv# n (λ () (if (= n 0) 1 (* n (! (- n 1)))))))))
 
Line 3,046:
"Display the length (in decimal digits) of the left factorials for:"
"1,000, 2,000 through 10,000 (inclusive), by thousands."
(pretty-format (for/list ((i (in-range 1000 10001 1000))) (add1 (order-of-magnitude (!n i))))))</langsyntaxhighlight>
 
{{out}}
Line 3,072:
Implement left factorial as a prefix !. Note that this redefines the core prefix ! (not) function.
 
<syntaxhighlight lang="raku" perl6line>sub prefix:<!> ($k) { (constant l = 0, |[\+] 1, (|[\*] 1..*))[$k] }
 
$ = !10000; # Pre-initialize
 
.say for ( 0 … 10, 20 … 110 ).hyper(:4batch).map: { sprintf "!%d = %s", $_, !$_ };
.say for (1000, 2000 … 10000).hyper(:4batch).map: { sprintf "!%d has %d digits.", $_, chars !$_ };</langsyntaxhighlight>
{{out}}
<pre>!0 = 0
Line 3,111:
!10000 has 35656 digits.</pre>
If you would rather not override prefix ! operator and you can live with just defining lazy lists and indexing into them, this should suffice; (and is in fact very slightly faster than the first example since it avoids routine dispatch overhead):
<syntaxhighlight lang="raku" perl6line>constant leftfact = 0, |[\+] 1, (|[\*] 1..*);
 
$ = leftfact[10000]; # Pre-initialize
 
.say for ( 0 … 10, 20 … 110 ).hyper(:4batch).map: { sprintf "!%d = %s", $_, leftfact[$_] };
.say for (1000, 2000 … 10000).hyper(:4batch).map: { sprintf "!%d has %d digits.", $_, chars leftfact[$_] };</langsyntaxhighlight>
 
Same output.
Line 3,124:
 
This is possible because there will be a number of trailing zeros which allow a floating point number to be converted to an integer.
<langsyntaxhighlight lang="rexx">/*REXX program computes/display the left factorial (or its dec. width) of N (or a range)*/
parse arg bot top inc . /*obtain optional arguments from the CL*/
if bot=='' | bot=="," then bot= 1 /*Not specified: Then use the default.*/
Line 3,143:
$= $ + ! /*add the factorial ───► L! sum. */
end /*#*/ /* [↑] handles gihugeic numbers. */
return $ /*return the sum (L!) to the invoker.*/</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the input of: &nbsp; &nbsp; <tt> 0 &nbsp; 10 </tt>}}
<pre>
Line 3,186:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
a = leftFact(0,10,1)
see "" + a + nl
Line 3,202:
else see "" + i + " " + leftFact + nl ok
next
</syntaxhighlight>
</lang>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">left_fact = Enumerator.new do |y|
f, lf = 1, 0
1.step do |n|
Line 3,212:
f *= n
end
end</langsyntaxhighlight>
'''Test:'''
<langsyntaxhighlight lang="ruby">tens = 20.step(110, 10)
thousands = 1000.step(10_000, 1000)
 
Line 3,225:
puts "!#{n} has #{lf.to_s.size} digits"
end
end</langsyntaxhighlight>
{{out}}
<pre>!0 = 0
Line 3,261:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight Runbasiclang="runbasic">a = lftFct(0,10,1)
a = lftFct(20,110,10)
a = lftFct(1000,10000,1000)
Line 3,280:
end if
next i
end function</langsyntaxhighlight>Output:
<pre>------ From 0 --To-> 10 Step 1 -------
0 1
Line 3,319:
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">
<lang Rust>
#[cfg(target_pointer_width = "64")]
type USingle = u32;
Line 3,443:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,482:
This solution uses the arbitrary precision integers from the rug crate,
which uses GMP under the covers.
<langsyntaxhighlight lang="rust">// [dependencies]
// rug = "1.9"
 
Line 3,513:
println!("length of !{} = {}", i, n.to_string().len());
}
}</langsyntaxhighlight>
 
{{out}}
Line 3,554:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">object LeftFactorial extends App {
 
// this part isn't really necessary, it just shows off Scala's ability
Line 3,574:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,617:
and (iota 5 100 2) produces a list (100 102 104 106 108)
 
<langsyntaxhighlight lang="scheme">
(import (scheme base) ;; library imports in R7RS style
(scheme write)
Line 3,645:
(lambda (i) (show i (string-length (number->string (left-factorial i)))))
(iota 10 1000 1000))
</syntaxhighlight>
</lang>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "bigint.s7i";
 
Line 3,683:
end for;
writeln;
end func;</langsyntaxhighlight>
 
{{out}}
Line 3,716:
=={{header|Sidef}}==
Built-in:
<langsyntaxhighlight lang="ruby">say 20.of { .left_factorial }</langsyntaxhighlight>
 
Straightforward:
<langsyntaxhighlight lang="ruby">func left_factorial(n) {
^n -> sum { _! }
}</langsyntaxhighlight>
 
Alternatively, using ''Range.reduce()'':
<langsyntaxhighlight lang="ruby">func left_factorial(n) {
^n -> reduce({ |a,b| a + b! }, 0)
}</langsyntaxhighlight>
 
A faster approach:
<langsyntaxhighlight lang="ruby">func left_factorial(n) {
static cached = 0
static factorial = 1
Line 3,746:
 
leftfact
}</langsyntaxhighlight>
 
Completing the task:
<langsyntaxhighlight lang="ruby">for n in (0..10, 20..110 `by` 10) {
printf("!%d = %s\n", n, left_factorial(n))
}
Line 3,755:
for n in (1000..10000 `by` 1000) {
printf("!%d has %d digits.\n", n, left_factorial(n).len)
}</langsyntaxhighlight>
 
{{out}}
Line 3,792:
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">
(* reuse earlier factorial calculations in dfac, apply to listed arguments in cumlfac *)
(* example: left factorial n, is #3 (dfac (0,n-1,1,1) ) *)
Line 3,822:
List.app (fn triple :int*int*int =>
print( Int.toString (1+ #1 triple ) ^ " : " ^ Int.toString (size(Int.toString (#3 triple ))) ^" \n" ) ) (List.drop(result,21) );
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,864:
{{libheader|AttaSwift BigInt}}
 
<langsyntaxhighlight lang="swift">import BigInt
 
func factorial<T: BinaryInteger>(_ n: T) -> T {
Line 3,900:
for i in stride(from: BigInt(2000), through: 10_000, by: 1000) {
print("!\(i) = \((!i).description.count) digit number")
}</langsyntaxhighlight>
 
{{out}}
Line 3,940:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc leftfact {n} {
set s 0
for {set i [set f 1]} {$i <= $n} {incr i} {
Line 3,954:
for {set i 1000} {$i <= 10000} {incr i 1000} {
puts "!$i has [string length [leftfact $i]] digits"
}</langsyntaxhighlight>
{{out}}
<pre>
Line 3,993:
{{libheader|Wren-fmt}}
{{libheader|Wren-big}}
<langsyntaxhighlight lang="ecmascript">import "/fmt" for Fmt
import "/big" for BigInt
 
Line 4,022:
}
System.print("\nLengths of left factorals from 1000 to 10000 by thousands:")
for (i in 1..10) Fmt.print(" !$-5d -> $5s", i * 1000, lfacts[i].toString.count)</langsyntaxhighlight>
 
{{out}}
Line 4,056:
=={{header|zkl}}==
{{trans|D}}
<langsyntaxhighlight lang="zkl">var BN=Import("zklBigNum");
 
fcn leftFact(n){
[1..n].reduce(fcn(p,n,rf){ p+=rf.value; rf.set(rf.value*n); p },
BN(0),Ref(BN(1)));
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">println("First 11 left factorials:\n", [0..10].apply(leftFact));
lfs:=[20..111,10].apply(leftFact);
println(("\n20 through 110 (inclusive) by tens:\n" +
Line 4,068:
 
println("Digits in 1,000 through 10,000 by thousands:\n",
[0d1_000..0d10_000, 1000].pump(List,fcn(n){leftFact(n).toString().len()}));</langsyntaxhighlight>
{{out}}
<pre>
10,327

edits