2016-06-21 59 views
1

我需要一個僅交換單詞中間字符(在第一個字符和最後一個字符之間)的函數。如果單詞由少於4個字符組成,該函數不應該改變任何內容。該函數有一個名爲exclude的參數,它是一個單詞末尾的潛在標點符號的矢量。只交換單詞中間字母的順序,並保留標點符號的順序(如果有的話)

您可以假設只有一個可能的標點符號。如果存在這樣的標記,則不應該改變它,並且不要計算實際單詞組成的字符數量。

我的想法是

  • 排除任何標點符號
  • 取出單詞的第一個字母
  • 取出字的最後一個字母
  • 交換其餘字母
  • 加回第一個和最後一個字母和標點符號

string <-c("well!") 
interchange.middle.of.word <- function(string, exclude = c(",",".","!","?")){ 
    result1 <- strsplit(string, split= "") 
    result2 <- unlist(result1) 
    result3 <- result2[ - which(result2 %in% exclude)] 
    result4 <- head(result3,-1) 
    result5 <- tail(result4,-1) 
    result6 <- sample(result5,replace = FALSE) 
    result7 <- c(result3[1],result6) 
    result8 <- c(result7, result4[length(result4)]) 
    result9 <- c(result8, result2[which(result2 %in% exclude)]) 
    result10 <- paste(result9,collapse="") 
    return(result10) 
} 

代碼就職於例如'well!',而不是另一個例子像'hello?'或字小於3個字母像'Tes'

  • 'hello?'我的結果是​​
  • 'Tes'我的結果是'NA'

如果有人能告訴我我的代碼出錯了,我將不勝感激。 非常感謝。

+0

你用了「交換」來形容的要求,但在你的代碼中被調用' sample()'which *隨機化*中間字符的順序。我對「交換」一詞的本能解釋是,你的意思是顛倒中間字符的順序。你能澄清一下你是否要*倒置*或*隨機化*中間字符? – bgoldst

+0

感謝您的評論。要求是隨機改變中間字母的順序。例如「好!」結果應該是兩個:「好!」和「wlel!「 – LoveVegas

回答

2

假設你想反向中間字符的順序:

revmiddle <- function(s,exclude=c(',','.','!','?')) { 
    if (nchar(s)<4L) return(s); 
    x <- strsplit(s,'')[[1L]]; 
    if (x[length(x)]%in%exclude) { 
     punc <- x[length(x)]; 
     x <- x[-length(x)]; 
    } else { 
     punc <- NULL; 
    }; ## end if 
    paste(collapse='',c(x[1L],x[seq(length(x)-1L,2L)],x[length(x)],punc)); 
}; ## end revmiddle() 

演示:

revmiddle('well!'); 
## [1] "wlel!" 
revmiddle('hello?'); 
## [1] "hlleo?" 
revmiddle('Tes'); 
## [1] "Tes" 

隨機中間字符的順序:

randmiddle <- function(s,exclude=c(',','.','!','?')) { 
    if (nchar(s)<4L) return(s); 
    x <- strsplit(s,'')[[1L]]; 
    if (x[length(x)]%in%exclude) { 
     punc <- x[length(x)]; 
     x <- x[-length(x)]; 
    } else { 
     punc <- NULL; 
    }; ## end if 
    paste(collapse='',c(x[1L],sample(x[-c(1L,length(x))]),x[length(x)],punc)); 
}; ## end randmiddle() 

演示(有意執行許多處決和收集整理獨特的效果,有效地展示了所有可能的結果):

sort(unique(replicate(1e3L,randmiddle('well!')))); 
## [1] "well!" "wlel!" 
sort(unique(replicate(1e3L,randmiddle('hello?')))); 
## [1] "hello?" "hlelo?" "hlleo?" 
sort(unique(replicate(1e3L,randmiddle('Tes')))); 
## [1] "Tes" 
+0

非常感謝你的幫助!你的代碼比我的代碼更加精確和高效。一個非常小的事情是,要求是隨機交換順序而不是反向......但仍然非常有幫助! – LoveVegas

+0

@LoveVegas你歡迎您參閱隨機編輯的實現。您使用'sample()'是正確的。 – bgoldst

+0

明白了!非常感謝! – LoveVegas