Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 20, 2010 17:51:28

ArsenEverlast
От:
Зарегистрирован: 2010-09-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

вот собственно в чем вопрос:надо написать прогу которая реализовует шифр цезаря,алгоритм детский,вот мой код

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…



Офлайн

#2 Сен. 20, 2010 17:57:42

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

ArsenEverlast, вместо ord и chr используйте «словари».
Т.е. создайте строку “АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ” и определяйте позицию буквы.



Офлайн

#3 Сен. 20, 2010 18:00:43

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

А, и ваш алгоритм не учитывает «границы алфавита» в ASCII таблице. Надо проверять индекс получившегося символа.



Офлайн

#4 Сен. 20, 2010 18:32:20

ArsenEverlast
От:
Зарегистрирован: 2010-09-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

а никак не можна зделать метод “универсальным” чтоб работал для всего набора символов юникода?
чтоб здесь line = str(raw_input(“Input data”)) line била набором юникода?
try …catch и всякие проверки я зделаю, ето не проблема



Отредактировано (Сен. 20, 2010 18:35:04)

Офлайн

#5 Сен. 20, 2010 18:54:03

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

ArsenEverlast, можно. Кириллица в Юникоде



Офлайн

#6 Сен. 20, 2010 19:10:28

ArsenEverlast
От:
Зарегистрирован: 2010-09-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

maxwell
хорошая статья про кириллицу, когда-то уже читал)
если можно, то как?)
я всего лишь хочу чтоб прога читала символ и ей било пофик что ето за символ, ее задача лишь перевести етот символ в число,зделать сдвиг на целое число и перевести назад в символ…если делать ето с файлом в формате utf8 то никаких проблем нету, а вот с консолью уже проблеми



Офлайн

#7 Сен. 20, 2010 19:28:13

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

помогите пожалуйста

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



Офлайн

#8 Сен. 20, 2010 19:50:03

ArsenEverlast
От:
Зарегистрирован: 2010-09-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

sp3
ОГРОМНОЕ СПАСИБО!! а все так просто получилось)))



Офлайн

#9 Сен. 20, 2010 20:49:29

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

Ну вы и понапридумывали…

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])



Офлайн

#10 Сен. 20, 2010 21:01:31

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите пожалуйста

knkd остаток от деления на 255 не дает «правильного» решения. Во всяком случае, имхо, ‘
caesar(’xyz', 1) должен возвращать ‘yza’, а не следующие символы по ASCII.
В случае с русскими символами работать вообще не будет.

Для «обучения» не обязательно писать все в одну строчку, тем более что это напрочь отбивает понимание «эффективности» программы.
Для «себя» или «проверить» — питон замечателен именно такими фишками, что вы привели + интерактивная консоль.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version