我如何用一个因子来争夺一个单词?

时间:2011-08-07 20:04:24

标签: python scramble

我想用一个因素来争论一个词。因素越大,这个词就会越乱。

例如,因子为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

5 个答案:

答案 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个字母进行交换。