Форум сайта python.su
Доброго времени суток
Листая одну замечательную книгу столкнулся с ошибкой
Код
import pyperclip message = "Xqp whh ahoa kb pda sknhz swo ejreoexha." key = 22 mode = 'decrypt' translated = '' num = 0 LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' message = message.upper() for symbol in message: if symbol in LETTERS: num = LETTERS.find(symbol) if mode == 'encrypt': num = num + key elif mode == 'decrypt': num = num - key if num >= len(LETTERS): num = num - len(LETTERS) elif num <= 0: num = num + len(LETTERS) translated = translated + LETTERS[num] else: translated = translated + symbol print(translated) pyperclip.copy(translated)
Traceback (most recent call last): File "C:\python\caesar.py", line 22, in <module> translated = translated + LETTERS[num] IndexError: string index out of range
if num >= len(LETTERS): num = num - len(LETTERS) elif num <= 0: num = num + len(LETTERS)
Отредактировано coffe4wolf (Авг. 2, 2016 10:59:41)
Офлайн
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' print list(enumerate(LETTERS)) [(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E'), (5, 'F'), (6, 'G'), (7, 'H'), (8, 'I'), (9, 'J'), (10, 'K'), (11, 'L'), (12, 'M'), (13, 'N'), (14, 'O'), (15, 'P'), (16, 'Q'), (17, 'R'), (18, 'S'), (19, 'T'), (20, 'U'), (21, 'V'), (22, 'W'), (23, 'X'), (24, 'Y'), (25, 'Z')]
Отредактировано noob_saibot (Авг. 2, 2016 11:23:24)
Офлайн
noob_saibot
Да уже решил х) какое-то время не мог понять откуда у меня этот индекс появляется.
Добавил условие - если num = 0, то таким его и оставлять. Правда выглядит не очень красиво. Можно реализовать данное условие как то по-лучше?
import pyperclip message = "'This is still a silly example.'" key = 0 mode = 'decrypt' translated = '' num = 0 LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' message = message.upper() for symbol in message: if symbol in LETTERS: num = LETTERS.find(symbol) if mode == 'encrypt': num = num + key elif mode == 'decrypt': num = num - key if num >= len(LETTERS): num = num - len(LETTERS) elif num < 0: num = num + len(LETTERS) elif num == 0: num = 0 translated = translated + LETTERS[num] else: translated = translated + symbol print(translated) pyperclip.copy(translated)
Офлайн
coffe4wolfТак а чего вот этот блок просто не убрать?
noob_saibotДа уже решил х) какое-то время не мог понять откуда у меня этот индекс появляется.Добавил условие - если num = 0, то таким его и оставлять. Правда выглядит не очень красиво. Можно реализовать данное условие как то по-лучше?
elif num == 0: num = 0
Офлайн
Подумайте, как будут кодироваться A и Z.
Офлайн
Shaman
В смысле как индексироваться?
А как LETTERS
Z как LETTERS либо LETTERS
Офлайн
noob_saibot
Вай, точно х) спасибище
Офлайн
coffe4wolf, у вас день ВДВ чтоль?
>>> LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> LETTERS.index('A') - 1 -1 >>> LETTERS.index('Z') + 1 26 >>> len(LETTERS) 26 >>>
Офлайн
циклическое получение индекса буквы алфавита
index=(LETTERS.find(symbol)+key)%len(LETTERS)
def CaesarCipherChar(c, k):
c = list(c)
alfavit = ''.join(chr(x) for x in range(ord('a'),ord('z')+1))
for i in range (len(c)):
if c[i].isalpha():
index = (alfavit.find(c[i].lower())+k)%len(alfavit)
c[i] = alfavit[index] if c[i] == c[i].lower() else alfavit[index].upper()
return ''.join(c)
message = input()
key = int(input())
print(CaesarCipherChar(message, key))
Отредактировано marvellik (Авг. 2, 2016 20:37:14)
Офлайн