2014-04-23 69 views
-1

我試圖編寫一個函數,它能隨機更改字中的字母,除了第一個和最後一個。隨機替換字中的字母

def fun(string) 
z=0 
s=string.size 
tab=string 
a=(1...s-1).to_a.sample s-1 
    for i in 1...(s-1) 
     puts tab[i].replace(string[a[z]]) 
     z=z+1 
    end 
    puts tab 
end 
fun("sample") 

我的輸出是:

p 
l 
a 
m 
sample 

有人知道如何使我的標籤是正確的? 它似乎改變爲塊,因爲在輸出是'plamp',所以它是隨機的,因爲我想要的但如果我想打印整個單詞(splampe)它不起作用。 :(

+2

你能解釋一下理想的行爲嗎? – xlembouras

+0

你問自己問題還是關於標籤變量? –

回答

2
s = 'sample' 
[s[0], s[1..-2].chars.shuffle, s[-1]].join 
# => "slpmae" 
0

這裏是我的解決方案:

def fun(string) 
    first = string[0] 
    last = string[-1] 
    middle = string[1..-2] 
    puts "#{first}#{middle.split('').shuffle.join}#{last}" 
end 

fun('sample') 
5

什麼:

def fun(string) 
    first, *middle, last = string.chars 
    [first, middle.shuffle, last].join 
end 

fun("sample") #=> "smalpe" 
0

也有一些問題,你的函數首先,當你說tab=string,標籤是現在。對字符串的引用,所以當你改變製表符上的字符時,你也要改變字符串字符。我認爲爲了清楚起見,最好保留樣本(1....n)的索引來引用原始字符中的位置射線。

我建議使用tab作爲新的數組。

def fun(string) 
    if string.length <= 2 
     return 
    z=1 
    s=string.size 
    tab = [] 
    tab[0] = string[0] 
    a=(1...s-1).to_a.sample(s-1) 

    (1...s-1).to_a.each do |i| 
    tab[z] = string[a[i - 1]] 
    z=z+1 
    end 

    tab.push string[string.size-1] 
    tab.join('') 

end 

fun("sample") 
=> "spalme" 
0

的另一種方法,使用String#gsub與塊:

def inner_jumble(str) 
    str.sub(/(?<=\w)\w{2,}(?=\w)/) { |s| s.chars.shuffle.join } 
end 

inner_jumble("pneumonoultramicroscopicsilicovolcanoconiosis") # * 
    #=> "poovcanaiimsllinoonroinuicclprsciscuoooomtces" 

inner_jumble("what ho, fellow coders?") 
    #=> "waht ho, folelw coedrs?" 
  • (?<=\w)是一個(「零寬度」)正向後看要求匹配到緊跟單詞字符。

  • (?=\w)是一個(「零寬度」)積極的預見,它需要立即跟隨匹配的單詞字符。

  • 您可以用\w\w+代替\w{2,}來匹配兩個或更多個連續的單詞字符。

  • 如果您只希望它適用於單個單詞,則可以使用gsubsub

*吸入非常細的灰塵和沙塵引起的肺部疾病,據說是一些英語詞典中最長的詞。