Вот ответ делается чисто числена и vectorised одной строки:
(2 * a %/% (b <- 10^(1:5))) * b +
((2 * a) %% (b/10)) +
0.3 * b - a
Он работает, обнуляя каждую цифру 2 * a
по очереди и помещая 3 вместо них, которая будет переворачиваться с 2 на 1 или наоборот. Он создает переменную b
, чтобы немного сократить код. Это можно удалить, заменив каждое b
своим определением или вызвав выражение в local()
.
Вот еще с помощью оператора трубы из magrittr
и матриц:
a %>% as.character %>% strsplit("") %>%
unlist %>% as.numeric %>% matrix(5, 5) %>%
`diag<-`(., 3 - diag(.)) %>% t %>% `%*%`(10^(4:0))
А вот аккуратнее версия второго с использованием чисто численных методов:
a %>% rep(5) %>% outer(4:0, function(x, y) x %/% (10^y) %% 10) %>%
`diag<-`(., 3 - diag(.)) %>% `%*%`(10^(0:4))
И еще с помощью бинарных и с использованием пакета R.utils
:
as.character(a) %>% strsplit("") %>% {.[[1]] == "2"} %>%
multiply_by_matrix(2^(4:0)) %>% bitwXor(2^(4:0)) %>%
intToBin %>% as.integer(.) + 11111
Что относительно '11111'? – Molx
да, извините, я добавил его :) – user1984076