2014-04-23 70 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

*吸入非常细的灰尘和沙尘引起的肺部疾病,据说是一些英语词典中最长的词。