Форум сайта python.su
вот собственно в чем вопрос:надо написать прогу которая реализовует шифр цезаря,алгоритм детский,вот мой код
s=“”
s1=“”
answer = input(“Choose action:1-code,2-decode,0-exit”)
if(answer==1):
line = str(raw_input(“Input data”))
key = int(input(“Input key”))
for letter in line:
s+=“”.join(chr(ord(letter)+key))
s1+=letter + “->” + s + “ ”
print(s1)
print(s)
elif(answer==2):
line = str(raw_input(“Input data”))
key = int(input(“Input key”))
for letter in line:
s+=“”.join(chr(ord(letter)-key))
s1+=letter + “->” + s + “ ”
print(s1)
print(s)
else :
exit
проблема в том что пашет только с символами ascii, а мне надо и чтоб с кирилицей…помогите плиз
стоит python 2.6.5, пишу в PyScripter…
Офлайн
ArsenEverlast, вместо ord и chr используйте «словари».
Т.е. создайте строку “АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ” и определяйте позицию буквы.
Офлайн
А, и ваш алгоритм не учитывает «границы алфавита» в ASCII таблице. Надо проверять индекс получившегося символа.
Офлайн
а никак не можна зделать метод “универсальным” чтоб работал для всего набора символов юникода?
чтоб здесь line = str(raw_input(“Input data”)) line била набором юникода?
try …catch и всякие проверки я зделаю, ето не проблема
Отредактировано (Сен. 20, 2010 18:35:04)
Офлайн
ArsenEverlast, можно. Кириллица в Юникоде
Офлайн
maxwellхорошая статья про кириллицу, когда-то уже читал)
Офлайн
s=""
s1=""
answer = input("Choose action:1-code,2-decode,0-exit")
if(answer==1):
line = raw_input("Input data")
key = int(input("Input key"))
for letter in line:
s+="".join(unichr(ord(letter)+key))
s1+=letter + "->" + s[-1] + " "
print(s1)
print(s)
elif(answer==2):
line = raw_input("Input data")
key = int(input("Input key"))
for letter in line:
s+="".join(unichr(ord(letter)-key))
s1+=letter + "->" + s[-1] + " "
print(s1)
print(s)
else :
exit
Офлайн
sp3ОГРОМНОЕ СПАСИБО!! а все так просто получилось)))
Офлайн
Ну вы и понапридумывали…
cesar_encode = lambda string,shift:''.join([chr((ord(x)+shift)%255) for x in string])
cesar_decode = lambda string,shift:''.join([chr((ord(x)-shift)%255) for x in string])
Офлайн
knkd остаток от деления на 255 не дает «правильного» решения. Во всяком случае, имхо, ‘
caesar(’xyz', 1) должен возвращать ‘yza’, а не следующие символы по ASCII.
В случае с русскими символами работать вообще не будет.
Для «обучения» не обязательно писать все в одну строчку, тем более что это напрочь отбивает понимание «эффективности» программы.
Для «себя» или «проверить» — питон замечателен именно такими фишками, что вы привели + интерактивная консоль.
Офлайн