Цикл для каждого символа в строке в кольце декодера Python - PullRequest
10 голосов
/ 24 ноября 2011

Я пытаюсь сделать простое кольцо декодера в Python.

Пример:

a=b, `b=c, c=d, etc.  

Я хочу, чтобы скрипт взял закодированное сообщение и вывел декодированное сообщение.
Например, я бы ввел "ifmmp", и он вывел бы "hello".

Я думал, что мне нужно разделить все символы на части и прокрутить их и изменить их значения chr() или ord().

В Python, похоже, нет документации для этого.

Ответы [ 4 ]

14 голосов
/ 24 ноября 2011

Как насчет:

s = 'ifmmp'
new_s = ''
for c in s:
    n = ord(c)
    n = n - 1
    if n < ord('a'):
        # 'a' -> 'z'
        n = ord('z')
    new_s += chr(n)
# print('new_s = %r' % new_s)  -> new_s = 'hello'

Конечно, это только работа с маленькими буквами, а не заглавными.

4 голосов
/ 24 ноября 2011

Забудьте о циклах, по возможности используйте функции, встроенные в Python:

from string import maketrans, translate, ascii_lowercase
import functools
translation = maketrans(ascii_lowercase, ascii_lowercase[-1]+ascii_lowercase[:-1])
decipher = functools.partial(string.translate, table=translation)

print(decipher("ifmmp")) # 'hello'
3 голосов
/ 24 ноября 2011
from string import maketrans

table = maketrans('abcdefghijklmnopqrstuvwxyz/','zabcdefghijklmnopqrstuvwxy ')

for x in ('pdfbo','qipophsbqi','cmvf/nppo/jo/b/sfe/tlz'):
    print x,' -> ',x.translate(table)

результат

pdfbo  ->  ocean
qipophsbqi  ->  phonograph
cmvf/nppo/jo/b/sfe/tlz  ->  blue moon in a red sky

.

Редактировать

Я переписал алгоритм Иоахима (функция better () ) и Iнаписал собственное решение, не используя maketrans () ( yop () ):

s = '{ifmmp}\t\tcmvf-nppo \n SUNNY ~ ajhabh 14568'

def bof(s):
    new_s = ''
    for c in s:
        n = ord(c)
        n = n - 1
        if n < ord('a'):
            # 'a' -> 'z'
            n = ord('z')
        new_s += chr(n)
    return new_s


def better(s):
    li = []
    for c in s:
        n = ord(c)-1
        if n == 96:
            li.append('z')
        elif 96<n<122:
            li.append(chr(n))
        else:
            li.append(c)
    return ''.join(li)

def yop(s):
    gen = ((c,ord(c)-1) for c in s)
    return ''.join('z' if y==96 else chr(y) if 96<y<122 else x for x,y in gen)


def better_yop(s):
    def gen(h):
        for c in h:
            n = ord(c)-1
            if n == 96:
                yield 'z'
            elif 96<n<122:
                yield chr(n)
            else:
                yield c
    return ''.join(gen(s))

for truc in (s,bof(s),better(s),yop(s),better_yop(s)):
    print '%r\n%s\n' % (truc,truc)

результат

'{ifmmp}\t\tcmvf-nppo \n SUNNY ~ ajhabh 14568'
{ifmmp}     cmvf-nppo 
 SUNNY ~ ajhabh 14568

'zhello|zzbluezmoonzzzzzzzzz}zzigzagzzzzzz'
zhello|zzbluezmoonzzzzzzzzz}zzigzagzzzzzz

'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello}     blue-moon 
 SUNNY ~ zigzag 14568

'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello}     blue-moon 
 SUNNY ~ zigzag 14568

'{hello}\t\tblue-moon \n SUNNY ~ zigzag 14568'
{hello}     blue-moon 
 SUNNY ~ zigzag 14568

Однако моя функция yop () медленнее, чем функция better ()

.

Edit

Теперь функция better_yop() имеет скорость, эквивалентную скорости лучше ()
Однако лучше () кажется немного быстрее, чем better_yop () .Поскольку это также проще, лучше () является лучшим

1 голос
/ 24 ноября 2011

Я бы порекомендовал сделать так, чтобы декодер звонил в словарь. Затем откройте входной файл для чтения, прочитайте файл, последовательно просматривайте символ и используйте словарь для перевода в выходную строку. Наконец, запишите эту строку в файл.

...