我想用一个因素来争论一个词。因素越大,这个词就会越乱。
例如,因子为1.00的“段落”一词将成为“paaprahrgs”,它将成为“paargarphs”,因子为0.50。
应考虑与原始字母位置的距离和乱码字母的数量。
到目前为止,这是我的代码,只能在没有因素的情况下进行搜索:
def Scramble(s):
return ''.join(random.sample(s, len(s)))
有什么想法吗?
P.S。这不是一个家庭作业 - 我正在尝试做这样的事情:http://d24w6bsrhbeh9d.cloudfront.net/photo/190546_700b.jpg
答案 0 :(得分:3)
您可以将该因子用作字符串中的一些随机字符。 由于因子看起来介于0和1之间,因此可以将因子乘以字符串的长度。
from random import random
def shuffle(string, factor):
string = list(string)
length = len(string)
if length < 2:
return string
shuffles = int(length * factor)
for i in xrange(shuffles):
i, j = tuple(int(random() * length) for i in xrange(2))
string[i], string[j] = string[j], string[i]
return "".join(string)
x = "computer"
print shuffle(x, .2)
print shuffle(x, .5)
print shuffle(x, .9)
coupmter
eocpumtr
rpmeutoc
如果您希望第一个和最后一个字符保持不变,只需将它们拆分并稍后添加即可。
def CoolWordScramble(string, factor = .5):
if len(string) < 2:
return string
first, string, last = string[0], string[1:-1], string[-1]
return first + shuffle(string, factor) + last
答案 1 :(得分:2)
你还没有定义你的“因素”应该是什么意思,所以请允许我为你重新定义:加扰因子N(整数)是将一个单词中的两个随机字母交换N次的结果。< / p>
使用此定义,0表示结果字与输入相同,1表示仅交换一对字母,10表示交换完成10次。
答案 2 :(得分:1)
你可以使“因子”大致对应于单词的两个相邻字母切换位置(换位)的次数。
在每个换位中,选择一个随机位置(从0到长度减去2),然后切换该位置的字母位置及其后面的字母。
答案 3 :(得分:1)
它可以通过多种方式实现,但这是我的解决方案:
写了一个只改变字母位置的函数:
def scramble(s):
s = list(s) #i think more easier, but it is absolutely performance loss
p = s.pop(random.randint(0, len(s)-1))
s.insert(random.randint(0, len(s)-1), p)
return "".join(s)
并编写了一个多次应用于字符串的函数:
def scramble_factor(s, n):
for i in range(n):
s = scramble(s)
return s
现在我们可以使用它了:
>>> s = "paragraph"
>>> scramble_factor(s, 0)
'paragraph'
>>> scramble_factor(s, 1)
'pgararaph'
>>> scramble_factor(s, 2)
'prahagrap'
>>> scramble_factor(s, 5)
'pgpaarrah'
>>> scramble_factor(s, 10)
'arpahprag'
当然,功能可以组合或嵌套,但我认为很清楚。
修改强>:
它不考虑距离,但是只需交换相邻字母就可以轻松替换加扰功能。这是一个:
def scramble(s):
if len(s)<=1:
return s
index = random.randint(0, len(s)-2)
return s[:index] + s[index + 1] + s[index] + s[index+2:]
答案 4 :(得分:-1)
你可以做一个倒数到0的for循环。
将String转换为Char-Array并使用RNG选择2个字母进行交换。