0

我想用一个因素来打乱一个词。因素越大,这个词就会变得越乱。

例如,因子为 1.00 的单词“paragraphs”将变为“paaprahrgs”,因子为 0.50 的词将变为“paargarphs”。

应考虑到原始字母位置的距离和加扰字母的数量。

到目前为止,这是我的代码,它只会在没有任何因素的情况下打乱:

def Scramble(s): 
    return ''.join(random.sample(s, len(s)))

有任何想法吗?

PS这不是家庭作业-我正在尝试做这样的事情:http: //d24w6bsrhbeh9d.cloudfront.net/photo/190546_700b.jpg

4

5 回答 5

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)

耦合
器 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
于 2011-08-07T20:39:50.790 回答
2

你还没有定义你的“因子”应该是什么意思,所以请允许我为你重新定义它:一个加扰因子 N(一个整数)将是一个单词中的两个随机字母交换 N 次的结果。

根据这个定义,0 表示结果词与输入相同,1 表示只交换一对字母,10 表示交换 10 次。

于 2011-08-07T20:23:44.057 回答
1

您可以使“因子”大致对应于单词的两个相邻字母交换位置的次数(换位)。

在每个换位中,选择一个随机位置(从 0 到长度减二),然后切换该位置的字母和其后的字母的位置。

于 2011-08-07T20:22:25.510 回答
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:]
于 2011-08-07T20:25:37.840 回答
-1

你可以做一个倒数到 0 的 for 循环。

将 String 转换为 Char-Array 并使用 RNG 选择 2 个字母进行交换。

于 2011-08-07T20:20:39.330 回答