1def plugboard(convertable_text, encoding_pattern):
2 pattern_dictionary = dict()
3 new_word = ""
4 for first_letter, second_letter in encoding_pattern:
5 pattern_dictionary[first_letter] = second_letter
6 pattern_dictionary[second_letter] = first_letter
7 for letter in convertable_text:
8 new_word += pattern_dictionary.get(letter, letter)
9 return new_word
10
11
12def rotor(convertable_text, encoding_pattern):
13 new_word = ""
14 for letter in convertable_text:
15 new_word += encoding_pattern.get(letter, " ")
16 return new_word
17
18
19def enigma_encrypt(plugboard_position, rotor_position):
20 def encryptor(function):
21 def encrypt_string(convertable_text):
22 return function(rotor(plugboard(convertable_text,
23 plugboard_position),
24 rotor_position))
25 return encrypt_string
26 return encryptor
27
28
29def enigma_decrypt(plugboard_position, rotor_position):
30 def decryptor(function):
31 def decrypt_string(convertable_text):
32 mirror_rotor_pos = dict([(value, key) for key, value in
33 rotor_position.items()])
34 return function(plugboard(rotor(convertable_text, mirror_rotor_pos),
35 plugboard_position))
36 return decrypt_string
37 return decryptor
.........
----------------------------------------------------------------------
Ran 9 tests in 0.001s
OK
Георги Кунчев
30.10.2023 19:24Здравей,
За първия въпрос - въпрос на вкус е малко. Ако предварително подготвиш речник, ще си малко по-бърза, защото вече имаш константа проверка за всяка буква от `convertable_text`. Така погледнато, може би с речник е по-добре.
Сравнявайки кода в коментара ти и този в самото решение, определено речника се чете по-лесно. Е, имаш няколко лисптащи интервала, но иначе изглежда добре.
Относно втория въпрос. Не знам защо твърдиш, че връщаш `None`. Всяка функция в решението ти има строго определен `return` и според мен работи удачно.
|
Михаела Илиева
30.10.2023 18:10Здравейте, имам два въпроса.
Първият е дали с пълнене на сетовете като двойки в речник е по-удачно
```
def plugboard(convertable_text, encoding_pattern):
pattern_dictionary=dict()
new_word = ""
for first_letter, second_letter in encoding_pattern:
pattern_dictionary[first_letter] = second_letter
pattern_dictionary[second_letter] = first_letter
for letter in convertable_text:
new_word += pattern_dictionary.get(letter,letter)
return new_word
```
, или само с обхождане на списъка за всяка буква, без допълнителна колекция е по-добре?
Вторият е свързан с декоратора. Вътре в него подаваме криптирания/декриптирания стринг на функцията, а трябва ли да връщаме нещо, защото сега при мен реално се връща None при изпълнението на функцията и не знам колко е коректно това?
|
| f | 1 | def plugboard(convertable_text, encoding_pattern): | f | 1 | def plugboard(convertable_text, encoding_pattern): |
| n | 2 | pattern_letters = [] | n | 2 | pattern_dictionary = dict() |
| 3 | new_word = "" | 3 | new_word = "" | ||
| 4 | for first_letter, second_letter in encoding_pattern: | 4 | for first_letter, second_letter in encoding_pattern: | ||
| n | 5 | pattern_letters.append(first_letter) | n | 5 | pattern_dictionary[first_letter] = second_letter |
| 6 | pattern_letters.append(second_letter) | 6 | pattern_dictionary[second_letter] = first_letter | ||
| 7 | for letter in convertable_text: | 7 | for letter in convertable_text: | ||
| n | 8 | if letter in pattern_letters: | n | 8 | new_word += pattern_dictionary.get(letter, letter) |
| 9 | if pattern_letters.index(letter)%2 == 0: | ||||
| 10 | new_word += pattern_letters[pattern_letters.index(letter)+1] | ||||
| 11 | else: | ||||
| 12 | new_word += pattern_letters[pattern_letters.index(letter)-1] | ||||
| 13 | else: | ||||
| 14 | new_word += letter | ||||
| 15 | return new_word | 9 | return new_word | ||
| 16 | 10 | ||||
| 17 | 11 | ||||
| 18 | def rotor(convertable_text, encoding_pattern): | 12 | def rotor(convertable_text, encoding_pattern): | ||
| 19 | new_word = "" | 13 | new_word = "" | ||
| 20 | for letter in convertable_text: | 14 | for letter in convertable_text: | ||
| t | 21 | if letter != " ": | t | ||
| 22 | new_word += encoding_pattern[letter] | 15 | new_word += encoding_pattern.get(letter, " ") | ||
| 23 | else: | ||||
| 24 | new_word += " " | ||||
| 25 | return new_word | 16 | return new_word | ||
| 26 | 17 | ||||
| 27 | 18 | ||||
| 28 | def enigma_encrypt(plugboard_position, rotor_position): | 19 | def enigma_encrypt(plugboard_position, rotor_position): | ||
| 29 | def encryptor(function): | 20 | def encryptor(function): | ||
| 30 | def encrypt_string(convertable_text): | 21 | def encrypt_string(convertable_text): | ||
| 31 | return function(rotor(plugboard(convertable_text, | 22 | return function(rotor(plugboard(convertable_text, | ||
| 32 | plugboard_position), | 23 | plugboard_position), | ||
| 33 | rotor_position)) | 24 | rotor_position)) | ||
| 34 | return encrypt_string | 25 | return encrypt_string | ||
| 35 | return encryptor | 26 | return encryptor | ||
| 36 | 27 | ||||
| 37 | 28 | ||||
| 38 | def enigma_decrypt(plugboard_position, rotor_position): | 29 | def enigma_decrypt(plugboard_position, rotor_position): | ||
| 39 | def decryptor(function): | 30 | def decryptor(function): | ||
| 40 | def decrypt_string(convertable_text): | 31 | def decrypt_string(convertable_text): | ||
| 41 | mirror_rotor_pos = dict([(value, key) for key, value in | 32 | mirror_rotor_pos = dict([(value, key) for key, value in | ||
| 42 | rotor_position.items()]) | 33 | rotor_position.items()]) | ||
| 43 | return function(plugboard(rotor(convertable_text, mirror_rotor_pos), | 34 | return function(plugboard(rotor(convertable_text, mirror_rotor_pos), | ||
| 44 | plugboard_position)) | 35 | plugboard_position)) | ||
| 45 | return decrypt_string | 36 | return decrypt_string | ||
| 46 | return decryptor | 37 | return decryptor |
| Legends | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||