You are given a string:
A <- "883745"
You can break down your calculation as follows:
ans = 0
ans += as.numeric(substr(A , 1, 1)) * (nchar(A) - 0)
ans += as.numeric(substr(A , 2, 2)) * (nchar(A) - 1)
ans += as.numeric(substr(A , 3, 3)) * (nchar(A) - 2)
ans += as.numeric(substr(A , 4, 4)) * (nchar(A) - 3)
ans += as.numeric(substr(A , 5, 5)) * (nchar(A) - 4)
ans += as.numeric(substr(A , 6, 6)) * (nchar(A) - 5)
This can be summarized as:
ans = 0
for i = 1, 2, ..., 6
ans += as.numeric(substr(A , i, i)) * (nchar(A) - i + 1)
end for
Here, i goes from 1 to 6, which is nchar(A), so you are to process all digits in "A".
Freshman
Loop as it is.
ans <- 0
for (i in 1:nchar(A)) {
ans <- ans + as.numeric(substr(A , i, i)) * (nchar(A) - i + 1)
}
ans
#[1] 134
Sophomore
Pre-compute the result of substring and nchar, then index them in the loop.
nc <- nchar(A)
N <- as.numeric(substring(A, 1:nc, 1:nc))
L <- nc:1
ans <- 0
for (i in 1:nc) {
ans <- ans + N[i] * L[i]
}
ans
#[1] 134
Junior
Replace the loop by sum.
nc <- nchar(A)
N <- as.numeric(substring(A, 1:nc, 1:nc))
L <- nc:1
ans <- sum(N * L)
ans
#[1] 134
Senior
Replace as.numeric + substring by utf8ToInt (@ThomasIsCoding). Replace sum by crossprod.
N <- utf8ToInt(A) - 48
L <- nchar(A):1
ans <- c(crossprod(N, L))
ans
#[1] 134
We can also pack it into one line:
c(crossprod(utf8ToInt(A) - 48, nchar(A):1))
#[1] 134