Left factorials: Difference between revisions

→‎Vectorization solution: Overhauled and added output.
(→‎Vectorization solution: Overhauled and added output.)
Line 2,905:
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.
<lang r>library(gmp)
leftFactorialleftFact <- function(nnumbs)
{
#As we will never actually use the numeric values of our outputs,
if(n==0){0}
#we will immediately coerce them to characters. For technical
else{sum(factorialZ(0:(n-1)))}
#If we really wanted#reasons to take caredo with nchar misbehaving, wethis couldalso havemakes usedtask format.3
}
#much easier.
leftFactorialVecInput<-function(vector)
sapply(numbs, function(n) as.character(if(n==0) 0 else sum(factorialZ(0:(n-1)))))
{
Vectorize(leftFactorial,SIMPLIFY=FALSE)(vector)
}
printer <- function(inputs) print(data.frame(Value = leftFact(inputs), row.names = paste0("!", inputs)))
 
#Task 1
leftFactorialVecInputprinter(0:10)
#Task 2
leftFactorialVecInputprinter(seq(20, 110, by = 10))
#Task 3
inputs<-seq(1000, 10000, by = 1000)
#nchar isn't very well-behaved on big numbers so it needs help from as.character.
print(data.frame(Digits = sapply(leftFact(inputs), nchar), row.names = paste0("!", inputs)))</lang>
#If we really wanted to take care with nchar misbehaving, we could have used format.
 
sapply(leftFactorialVecInput(seq(1000,10000,by=1000)),function(x) nchar(as.character(x)))</lang>
{{out}}
<pre>> printer(0:10)
Value
!0 0
!1 1
!2 2
!3 4
!4 10
!5 34
!6 154
!7 874
!8 5914
!9 46234
!10 409114
 
> printer(seq(20, 110, by = 10))
Value
!20 128425485935180314
!30 9157958657951075573395300940314
!40 20935051082417771847631371547939998232420940314
!50 620960027832821612639424806694551108812720525606160920420940314
!60 141074930726669571000530822087000522211656242116439949000980378746128920420940314
!70 173639511802987526699717162409282876065556519849603157850853034644815111221599509216528920420940314
!80 906089587987695346534516804650290637694024830011956365184327674619752094289696314882008531991840922336528920420940314
!90 16695570072624210767034167688394623360733515163575864136345910335924039962404869510225723072235842668787507993136908442336528920420940314
!100 942786239765826579160595268206839381354754349601050974345395410407078230249590414458830117442618180732911203520208889371641659121356556442336528920420940314
!110 145722981061585297004706728001906071948635199234860720988658042536179281328615541936083296163475394237524337422204397431927131629058103519228197429698252556442336528920420940314
 
print(data.frame(Digits = sapply(leftFact(inputs), nchar), row.names = paste0("!", inputs)))
Digits
!1000 2565
!2000 5733
!3000 9128
!4000 12670
!5000 16322
!6000 20062
!7000 23875
!8000 27749
!9000 31678
!10000 35656</pre>
 
=={{header|Racket}}==
331

edits