【问题标题】:How can I scramble a word with a factor?我怎样才能用一个因素来打乱一个词?
【发布时间】:2011-10-21 23:18:57
【问题描述】:

我想用一个因素来打乱一个词。系数越大,字越乱。

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

要考虑到原始字母位置的距离和乱码的个数。

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

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

有什么想法吗?

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

【问题讨论】:

  • 注意这样的打乱应该把第一个和最后一个字母留在原来的位置,否则起不到同样的效果。
  • then "if len(word) > 3: print word[0] + Scramble(word[1:-1]) + word[-1]" 就可以了
  • 你应该知道,这个单词内部字母的打乱已经被彻底研究过:mrc-cbu.cam.ac.uk/people/matt.davis/cmabridge

标签: python scramble


【解决方案1】:

您可以将该因子用作字符串中的多个改组字符。 由于因子似乎介于 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

【讨论】:

  • 这正是我想要的......谢谢
【解决方案2】:

它可以通过多种方式实现,但这是我的解决方案:

编写了一个只改变字母位置的函数:

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'

当然函数可以组合或嵌套,但我认为很清楚。

编辑

它不考虑距离,但是为了交换相邻的字母而很容易替换 scramble 功能。这是一个:

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:]

【讨论】:

  • 这个算法没有考虑距离,但这是一个不错的开始。我会用它。谢谢!
  • 添加了另一个打乱功能,只是交换相邻的字母,更适合。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-02-19
        • 2021-12-21
        • 2019-09-01
        • 2014-01-02
        • 2014-04-26
        • 2020-07-17
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        相关资源
        最近更新 更多