मेरे पास आर में कुछ इनपुट स्ट्रिंग्स हैं। इनपुट स्ट्रिंग्स हैं:
abcde, abcdabcd, apapap
आउटपुट स्ट्रिंग्स होनी चाहिए:
abcde, abcdbcde, apbqcr
मुझे आर कोड चाहिए जो यह काम करता है। हमें स्ट्रिंग को पुनरावृत्त करने में सक्षम होना चाहिए, स्ट्रिंग में [a-z]
वर्णों की घटनाओं की संख्या की गणना करना चाहिए और वर्ण को चक्रीय रूप से 1 से बढ़ाना चाहिए। इसका अर्थ है a + 1 = b
, b + 2 = d
और इसी तरह। संख्यात्मक तारों को अनदेखा किया जाना चाहिए।
2
Bullu
12 जुलाई 2018, 16:13
3 जवाब
तुम कर सकते हो:
library(purrr);library(magrittr)
vec <- c("abcde", "abcdabcd", "apapap","aaaa","zzzz")
letters2counts <- 1:26
names(letters2counts) <- letters[1:26]
num_vec <- sapply(vec,strsplit,split="") %>% map(~letters2counts[.] %>% unname)
counts <- map(num_vec,~{u<-table(.);cbind(as.numeric(row.names(u)),as.numeric(u))})
fun1 <- function(x,n) {
x=x
used_inds <- NULL
for(i in unique(x)) {
nn <- n[,2][n[,1] %in% i]
if(nn == 0) next;
ind<- which(x %in% i) %>% setdiff(.,used_inds)
x[ind] <- x[ind]+0:(nn-1)
used_inds <- c(ind,used_inds)
}
x[x > 26] <- x[x > 26] - 26
return(x)
}
num_vec_calc <- Map(fun1,x=num_vec,n=counts)
map(num_vec_calc,~names(letters2counts)[.]%>% paste(.,collapse=""))
नतीजा:
$abcde
[1] "abcde"
$abcdabcd
[1] "abcdbcde"
$apapap
[1] "apbqcr"
$aaaa
[1] "abcd"
$zzzz
[1] "zabc"
1
Andre Elrico
12 जुलाई 2018, 17:39
increment <- function(x) {
x <- strsplit(x, "")[[1L]]
# now iterate through unique letters in string
done <- vector(mode = "logical", length = length(x))
for (l in unique(x)) {
ln <- which(letters == l)
where_m <- !done & l == x
incrm_by <- 0:(sum(where_m) - 1)
# Modulo operator tricky when indexing starts at 1
x[where_m] <- letters[(ln + incrm_by - 1) %% 26 + 1]
done[where_m] <- TRUE
}
paste(x, collapse = "")
}
sapply(x, increment)
abcde abcdabcd apapap
"abcde" "abcdbcde" "apbqcr"
ध्यान दें कि एक सेकंड z
बढ़ कर a
हो जाता है
vec <- c("abcde", "abcdabcd", "apapap","aaaa","zzzzzz")
sapply(vec, increment)
abcde abcdabcd apapap aaaa zzzzzz
"abcde" "abcdbcde" "apbqcr" "abcd" "zabcde"
1
sindri_baldur
12 जुलाई 2018, 18:32
sapply("zz", increment)
से "zNA"
निकलता है
Andre Elrico
12 जुलाई 2018, 17:58
fun <- function(x){
a <- strsplit(x, "")[[1]] # split the string to letters
b <- strtoi(a, base = 36) - 9 # convert the letters to integers
c <- numeric()
c[1] <- b[1]
if(length(b) > 1){
for(i in 2:length(b)){
c[i] <- b[i] + sum(b[1:(i-1)] == b[i])
}
}
c <- c %% 26 ; c[c==0] <- 26
result <- paste0(letters[c], collapse = "")
return(result)
}
# fun("a")
# [1] "a"
# fun("zzz")
# [1] "zab"
# fun("abcde")
# [1] "abcde"
# fun("abcdabcd")
# [1] "abcdbcde"
# fun("apapap")
# [1] "apbqcr"
1
Darren Tsai
12 जुलाई 2018, 18:59
मैं अपने उत्तर को
– if
शर्त के साथ संशोधित करता हूं।
Darren Tsai
12 जुलाई 2018, 18:17
zzzz
पर भी विफल
sindri_baldur
12 जुलाई 2018, 18:35
z
के साथ क्या करते हैं? कृपया अपना वर्तमान कोड साझा करें जिसमें आपको समस्या है।a bc da bc d
(abcd abcd
के स्थान पर) के रूप में क्यों नहीं पढ़ा जाना चाहिए, और चूंकिbc
दो बार आता है, परिणामa bc da cd d
के स्थान पर होगाabcd bcde
. क्या आप एल्गोरिदम को खिलाने के लिए 100% जलरोधक तर्क प्रदान कर सकते हैं?