Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Решение задачи Python

настя Ученик (104), на голосовании 2 недели назад
Получилась неплохая шифровальная программа, но над ней стоит ещё немного поработать. Методы cipher() и decipher() практически полностью повторяют друг друга, а это нарушает принцип DRY — “Don’t Repeat Yourself”.
Сделайте код ещё лучше: вместо двух методов напишите один: process_text(). Этот метод должен быть универсальным и работать «в обе стороны» — и для шифрования строки, и для дешифровки.
Метод process_text() должен принимать на вход три дополнительных аргумента (помимо self):
process_text(self, text, shift, is_encrypt)
text — строка для шифрования или дешифровки;
shift — число, означающее смещение символов при шифровании;
is_encrypt — булево значение: флаг; True — если строку надо зашифровать, False — если надо расшифровать.
Этот метод должен возвращать строку (зашифрованную или расшифрованную, в зависимости от флага, полученного на вход).
После выполнения работы проверьте свой код — вызовите метод process_text():
# Ваш код здесь.
...

# Проверка:
cipher_master = CipherMaster()
print(cipher_master.process_text(
text='Однажды ревьюер принял проект с первого раза, с тех пор я его боюсь',
shift=2,
is_encrypt=True
))
print(cipher_master.process_text(
text='Олебэи яфвнэ мроплж сэжи — э пэй рдв злййвкпш лп нвящывнэ',
shift=-3,
is_encrypt=False
))
Подсказка: Проверьте значение флага is_encrypt и в зависимости от результата проверки выполните шифрование или дешифровку.


class CipherMaster:
alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'

def cipher(self, original_text, shift):
encipted_text = ''
# Метод должен возвращать зашифрованный текст
# с учетом переданного смещения shift.
for encripted_letter in str.lower(original_text):
position = str.find(self.alphabet, encripted_letter)
if position >= 0:
new_position = (position + shift) % len(self.alphabet)
encipted_text += self.alphabet[new_position]
else:
encipted_text += encripted_letter
return encipted_text


def decipher(self, cipher_text, shift):
dechipher_text = ''
# Метод должен возвращать исходный текст
# с учётом переданного смещения shift.
for decripted_letter in str.lower(cipher_text):
position = str.find(self.alphabet, decripted_letter)
if position >= 0:
new_position = (position - shift) % len(self.alphabet)
dechipher_text += self.alphabet[new_position]
else:
dechipher_text += decripted_letter
return dechipher_text


cipher_master = CipherMaster()
print(cipher_master.cipher(
original_text='Однажды ревьюер принял проект с первого раза, с тех пор я его боюсь',
shift=2
))
print(cipher_master.decipher(
cipher_text='Олебэи яфвнэ мроплж сэжи — э пэй рдв злййвкпш лп нвящывнэ',
shift=-3
))
Голосование за лучший ответ
Леонтьев Михаил Мастер (2300) 1 месяц назад
Чтобы объединить методы шифрования и дешифрования в один, можно создать метод `process_text`, который будет принимать флаг для определения, нужно ли зашифровать или расшифровать текст. Вот обновленный код:

```python
class CipherMaster:
alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'

def process_text(self, text, shift, is_encrypt):
result_text = ''
for letter in str.lower(text):
position = str.find(self.alphabet, letter)
if position >= 0:
if is_encrypt:
new_position = (position + shift) % len(self.alphabet)
else:
new_position = (position - shift) % len(self.alphabet)
result_text += self.alphabet[new_position]
else:
result_text += letter
return result_text

# Проверка:
cipher_master = CipherMaster()
print(cipher_master.process_text(
text='Однажды ревьюер принял проект с первого раза, с тех пор я его боюсь',
shift=2,
is_encrypt=True
))
print(cipher_master.process_text(
text='Олебэи яфвнэ мроплж сэжи — э пэй рдв злййвкпш лп нвящывнэ',
shift=-3,
is_encrypt=False
))
```

### Объяснение:
1. **Метод `process_text`**: Он принимает три аргумента: `text` (строка для шифрования или дешифровки), `shift` (число для смещения) и `is_encrypt` (флаг, указывающий, что делать).
2. **Логика шифрования и дешифрования**: В зависимости от значения `is_encrypt`, выполняется соответствующее смещение символов.
3. **Возвращаемый результат**: Метод возвращает зашифрованный или расшифрованный текст в зависимости от переданного флага.

Теперь код стал более компактным и следует принципу DRY.
настяУченик (104) 1 месяц назад
Спасибо большое за ответ с подробными комментариями!
Похожие вопросы