Домашни > Енигма > Решения > Решението на Михаела Илиева

Резултати
10 точки от тестове
0 точки от учител

10 точки общо

9 успешни теста
0 неуспешни теста
Код

 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 при изпълнението на функцията и не знам колко е коректно това?
История

f1def plugboard(convertable_text, encoding_pattern):f1def plugboard(convertable_text, encoding_pattern):
n2    pattern_letters = []n2    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:
n5        pattern_letters.append(first_letter)n5        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:
n8        if letter in pattern_letters:n8        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_word9    return new_word
1610
1711
18def rotor(convertable_text, encoding_pattern):12def rotor(convertable_text, encoding_pattern):
19    new_word = ""13    new_word = ""
20    for letter in convertable_text:14    for letter in convertable_text:
t21        if letter != " ":t
22            new_word += encoding_pattern[letter]15        new_word += encoding_pattern.get(letter, " ")
23        else:
24            new_word += " "
25    return new_word16    return new_word
2617
2718
28def enigma_encrypt(plugboard_position, rotor_position):19def 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_string25        return encrypt_string
35    return encryptor26    return encryptor
3627
3728
38def enigma_decrypt(plugboard_position, rotor_position):29def 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_string36        return decrypt_string
46    return decryptor37    return decryptor
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op