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