Как я могу зашифровать слово с фактором? - PullRequest
0 голосов
/ 08 августа 2011

Я хотел бы зашифровать слово с фактором.Чем больше коэффициент, тем более зашифрованным будет слово.

Например, слово «параграфы» с коэффициентом 1,00 станет «паапрагмом», а оно станет «парагарфом» с коэффициентом 0,50..

Следует учитывать расстояние от исходной позиции букв и количество зашифрованных букв.

Пока это мой код, который шифрует только без коэффициента:

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

Есть идеи?

PS Это не домашняя работа - я пытаюсь сделать что-то вроде этого: http://d24w6bsrhbeh9d.cloudfront.net/photo/190546_700b.jpg

Ответы [ 5 ]

3 голосов
/ 08 августа 2011

Вы можете использовать коэффициент как число тасующих символов в строке вокруг.Поскольку коэффициент кажется между 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)

Coumtereocpumtrrpmeutoc

Если вы хотите, чтобы первый и последний символы оставались на месте, просто разделите их и добавьте позже.

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 голосов
/ 08 августа 2011

Вы не определили, что должен означать ваш «фактор», поэтому позвольте мне переопределить его для вас: коэффициент скремблирования N (целое число) будет результатом замены двух случайных букв в слове, N раз.

В этом определении 0 означает, что результирующее слово совпадает с вводом, 1 означает, что только одна пара букв поменялась местами, а 10 означает, что своп выполняется 10 раз.

1 голос
/ 08 августа 2011

Это может быть реализовано многими способами, но вот мое решение:

Написал функцию, которая просто меняет место буквы:

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:]
1 голос
/ 08 августа 2011

Вы можете сделать «фактор» примерно соответствующим количеству раз, когда две соседние буквы слова меняют свои позиции (транспонирование).

В каждом транспонировании выберите случайную позицию (от 0 до длины-минус два), затем поменяйте местами букву в этой позиции и букву, которая следует за ней.

0 голосов
/ 08 августа 2011

Вы можете сделать цикл for, который отсчитывает до 0.

Преобразование строки в массив символов и использование ГСЧ для выбора двух букв для замены.

...