0

因数で単語をごちゃ混ぜにしたいと思います。係数が大きいほど、単語がごちゃごちゃになります。

たとえば、係数が 1.00 の単語「paragraphs」は「paaprahgs」になり、係数が 0.50 の「paargarphs」になります。

元の文字位置からの距離とスクランブル文字の数を考慮する必要があります。

これはこれまでの私のコードであり、要因なしでスクランブルするだけです:

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

何か案は?

PS これは宿題ではありません - 私は次のようなものを作ろうとしています:

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)

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
于 2011-08-07T20:39:50.790 に答える
2

「因子」の意味を定義していないので、再定義させてください。スクランブリング因子 N (整数) は、単語内の 2 つのランダムな文字を N 回交換した結果です。

この定義では、0 は結果の単語が入力と同じであることを意味し、1 は 1 組の文字のみが交換されることを意味し、10 は交換が 10 回行われることを意味します。

于 2011-08-07T20:23:44.057 に答える
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'

もちろん、関数を組み合わせたり入れ子にしたりすることはできますが、それは明らかだと思います。

編集

距離は考慮されていませんが、スクランブル機能は隣接する文字を交換するだけで簡単に置き換えられます. ここに1つがあります:

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

「因子」は、単語の隣接する 2 つの文字の位置が入れ替わる回数 (転置) にほぼ対応させることができます。

各転置では、ランダムな位置 (0 から長さマイナス 2 まで) を選択し、その位置の文字とそれに続く文字の位置を入れ替えます。

于 2011-08-07T20:22:25.510 に答える
-1

0 までカウントダウンする for ループを実行できます。

String を Char-Array に変換し、RNG を使用して交換する 2 文字を選択します。

于 2011-08-07T20:20:39.330 に答える