我试着写一个函数,它能够随机改变单词中的字母,除了第一个和最后一个。
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)它不起作用。 :(
答案 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,}
来匹配两个或多个连续的字符。
如果您只想将其应用于单个字词,可以使用gsub
或sub
。
*吸入非常细小的灰尘和沙尘引起的肺部疾病,据说是一些英语词典中最长的词。