मेरे पास आर में कुछ इनपुट स्ट्रिंग्स हैं। इनपुट स्ट्रिंग्स हैं:

  • abcde, abcdabcd, apapap

आउटपुट स्ट्रिंग्स होनी चाहिए:

  • abcde, abcdbcde, apbqcr

मुझे आर कोड चाहिए जो यह काम करता है। हमें स्ट्रिंग को पुनरावृत्त करने में सक्षम होना चाहिए, स्ट्रिंग में [a-z] वर्णों की घटनाओं की संख्या की गणना करना चाहिए और वर्ण को चक्रीय रूप से 1 से बढ़ाना चाहिए। इसका अर्थ है a + 1 = b, b + 2 = d और इसी तरह। संख्यात्मक तारों को अनदेखा किया जाना चाहिए।

2
Bullu 12 जुलाई 2018, 16:13
4
और z के साथ क्या करते हैं? कृपया अपना वर्तमान कोड साझा करें जिसमें आपको समस्या है।
 – 
Wiktor Stribiżew
12 जुलाई 2018, 16:18
2
सबस्ट्रिंग-लम्बाई आपके उदाहरण में परिवर्तनीय प्रतीत होती है। तो दूसरी स्ट्रिंग को a bc da bc d (abcd abcd के स्थान पर) के रूप में क्यों नहीं पढ़ा जाना चाहिए, और चूंकि bc दो बार आता है, परिणाम a bc da cd d के स्थान पर होगा abcd bcde. क्या आप एल्गोरिदम को खिलाने के लिए 100% जलरोधक तर्क प्रदान कर सकते हैं?
 – 
Wimpel
12 जुलाई 2018, 16:19
1
एक बहुत ही रोचक समस्या है, लेकिन सवाल अभी तक पूरी तरह से स्पष्ट नहीं है।
 – 
Andre Elrico
12 जुलाई 2018, 16:52

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