随机替换单词中的字母

时间:2014-04-23 13:28:04

标签: ruby

我试着写一个函数,它能够随机改变单词中的字母,除了第一个和最后一个。

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)它不起作用。 :(

5 个答案:

答案 0 :(得分:5)

怎么样:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

这是我的解决方案:

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

fun('sample')

答案 3 :(得分:0)

您的功能存在一些问题。首先,当您说tab=string时,tab现在是对字符串的引用,因此,当您更改选项卡上的字符时,您也会更改字符串字符。我认为为了清晰起见,最好保持样本(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" 

答案 4 :(得分: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)是一个(&#34;零宽度&#34;)正面后卫,要求匹配紧跟一个单词字符。

  • (?=\w)是一个(&#34;零宽度&#34;)正面预测,需要匹配后立即跟一个单词字符。

  • 您可以使用\w\w+代替\w{2,}来匹配两个或多个连续的字符。

  • 如果您只想将其应用于单个字词,可以使用gsubsub

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