Я пытаюсь найти наиболее эффективный способ вычисления взвешенной суммы цифр для числовой строки (где вес равен позиции цифры в числовой строке).
Пример: для числа 1059 взвешенная сумма цифр рассчитывается как 1 * 1 + 0 * 2 + 5 * 3 + 9 * 4 = 52.
Я хотел бы разрешить ввод любой длины, но если есть более эффективные способы, когда есть ограничение на длину строки (например, знание того, что число не более 10 цифр, позволяет использовать более эффективную программу), я открыты и для этого. Кроме того, если предпочтительно, чтобы вход был типа numeric, а не character, это тоже приемлемо.
У меня сейчас старомодный цикл for:
wsod <- function(str) {
output <- 0
for (pos in 1:nchar(str)) {
digit <- as.numeric(substr(str, pos , pos))
output <- output + pos * digit
}
output
}
Несколько решений были предложены для Python (с использованием числового ввода), но я не думаю, что они применимы к R.





weighted.digit <- function(str) {
splitted.nums <- as.numeric(strsplit(str, '')[[1]])
return(sum(splitted.nums * 1:length(splitted.nums)))
}
weighted.digit('1059')
[1] 52
Можно изменить это, чтобы принять числовой ввод, а затем просто преобразовать его в символ в качестве первого шага.
> number <- 1059
> x <- strsplit(as.character(number), "")[[1]]
> y <- seq_len(nchar(number))
> as.numeric(as.numeric(x) %*% y)
[1] 52
Я провел тест с 1 миллионом случайно сгенерированных целых чисел от 1 до 100000000; моему циклу for потребовалось около 20 секунд, чтобы сделать то, что этот подход делает примерно за 5 секунд