LINUX.ORG.RU

Python: простейший алгоритм шифрования


0

1

Имеется текстовый файл, который содержит два слова, например, «cake» и «lie». Последовательность слов может быть разной, например:

cakecakecakelieliecakelielielielieliecakecakecake
lielielielielielieliecakecakelielie
. Идея состоит в том, чтобы создать копию этого файла, где последовательность из слов cake кодируется как «C#», а «lie» - как «L#», где # - количество идущих подряд подобных элементов. Таким образом, указанный образец будет выглядеть примерно так:
C3L2C1L5C3
L7C2L2
Разумеется, файлы будут значительно бОльшими, нежели этот, поэтому потребуется достаточно быстрый алгоритм. Я понимаю, что в целях быстроты мне многие посоветуют написать то же самое на C, но я надеюсь, это можно реализовать довольно удачно и средствами Python. Подскажите, пожалуйста, как сделать это «по уму».

> «по уму»

Python

How about no.

anonymous
()

считываешь строчку из файла, высчитываешь регулярными выражениями кол-во cake'ов и lie'ов, и кодируешь в запись вида C%dL%d, записывая в выходной файл. Затем с следующей строчкой так делаешь и т.д.

Ну, я бы так сделал. Возможно быдлокод.

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

Ему подряд идущее количество нужно.

Решение втупую: определить, что за слово в начале строки, увеличить счётчик соответствующий, удалить это слово из начала. Если следующее слово такое же - увеличивать текущий счётчик. Если нет - записать C# в результат и завести новый счётчик.
Продолжать, пока строка не опустеет.

schizoid ★★★
()

это не шифрование, а сжатие данных, в вашем случае, получается, с известным словарем. смотрите, например, Run-length encoding.

hizel ★★★★★
()
Ответ на: комментарий от schizoid

знаю что подряд. Но разве эти cake&lie в какой-то определенной размерности не отделяются друг от друга переводом строки? В исходном примере файла что представил ТС перевод строки вроде имеется.

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

Для твоего алгоритма первая строка выглядела бы как C7L7, а не C3L2C1L5C3, как нужно ТС.
Да и перевод строки в данном случае ни на что не влияет.

schizoid ★★★
()
Ответ на: комментарий от ghostmansd
src, dst = open(...), open(...)

ws = ['c...', 'l...']
ns, first = map( len, ws ), ( ws[0][0], ws[1][0] )
FIRST = map( str.upper, first )

for l in src :
    if len(l)==1 : dst.write('\n'); continue 
    n, c, w = len(l)-1, 1, l[0]==first[1] 
    i = ns[w]
    while i<n : 
        if first[w]==l[i] : c += 1; i += ns[w]
        else : dst.write( '%s%d'%( FIRST[w], c ) ); w, c = not w, 1
    dst.write( '%s%d\n'%( FIRST[w], c ) )

Как то так (не тестил). Коряво, и быстрее вряд ли получится... работает только если в файле слова из списка и никаких других. Если таки важна производительность, нужно пошукать решение на С - огно наверняка есть, алгоритм типовой.

AIv ★★★★★
()
Ответ на: комментарий от schizoid

>Для твоего алгоритма первая строка выглядела бы как С7L7

нет. Выглядела бы как надо при умении пользоваться регулярками.

chinarulezzz ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.