Домашни > Енигма > Решения > Решението на Филип Филчев

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

10 точки общо

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

 1def plugboard(string_to_encode: str, plugboard_position: list):
 2    """Encode a String based on the Pairs of Chars in the List of Sets.
 3
 4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.
 5    This way it can use the rotor Function.
 6    """
 7
 8    tuple_pairs = list([tuple(curr_set) for curr_set in plugboard_position])
 9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])
10    encoding_dict = dict(tuple_pairs)
11
12    return rotor(string_to_encode, encoding_dict)
13
14
15def rotor(string_to_encode: str, rotor_position: dict):
16    """Encodes a String using the Key, Value Pairs in the Dict."""
17    return "".join([rotor_position.get(ch, ch) for ch in string_to_encode])
18
19
20def enigma_encrypt(plugboard_position: list, rotor_position: dict):
21    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor."""
22
23    def enigma_encrypt_decorator(func):
24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it."""
25
26        def decorated_func(s: str):
27            """Encrypt a String before calling a Function."""
28            return func(rotor(plugboard(s, plugboard_position), rotor_position))
29
30        return decorated_func
31
32    return enigma_encrypt_decorator
33
34
35def enigma_decrypt(plugboard_position: list, rotor_position: dict):
36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor."""
37    rotor_position = {y: x for x, y in rotor_position.items()}
38
39    def enigma_decrypt_decorator(func):
40        """Decorate a Function that excepts a single String, to decrypt the String before calling it."""
41
42        def decorated_func(s: str):
43            """Decrypt a String before calling a Function."""
44            return func(plugboard(rotor(s, rotor_position), plugboard_position))
45
46        return decorated_func
47
48    return enigma_decrypt_decorator

.........
----------------------------------------------------------------------
Ran 9 tests in 0.001s

OK

Дискусия
Георги Кунчев
25.10.2023 13:04

Да, да, наистина е така. Моя грешка. Можеш да пренебрегнеш коментара ми на 8 ред.
Филип Филчев
25.10.2023 11:13

В условието се казва, че на plugboard се подава list of sets с 2 елемента. Затова в началото го превръщам в tuples. Не разбирам първия ти коментар. Може ли пояснение?
Георги Кунчев
25.10.2023 10:02

Не е проблем да ги типизираш. Така или иначе, ти не ги типизираш, а само ги хинтваш. Все още могат да се подават аргументи от всякакъв тип и това няма да доведе до грешка. Просто помогаш на IDE-то и другит програмисти с това. Като цяло имаш много добро и чисто решение. Коментарите ми са само неща, които могат, според мен, да го направят една идея по-чисто, но решението е добро и така.
Филип Филчев
24.10.2023 23:57

Типизирах си параметрите, за да може IDE-то да ми подсказва с методи. Не знам дали е добре да се прави. Ако не е ще ги махна.
История

f1def plugboard(string_to_encode: str, plugboard_position: list):f1def plugboard(string_to_encode: str, plugboard_position: list):
2    """Encode a String based on the Pairs of Chars in the List of Sets.2    """Encode a String based on the Pairs of Chars in the List of Sets.
33
4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.
n5    This way it can use the rotor Function with the Plugboard's Position acting like a Rotor Positionn5    This way it can use the rotor Function.
6    """6    """
77
n8    tuple_pairs = list([tuple(pair) for pair in plugboard_position])n8    tuple_pairs = list([tuple(curr_set) for curr_set in plugboard_position])
9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])
10    encoding_dict = dict(tuple_pairs)10    encoding_dict = dict(tuple_pairs)
1111
12    return rotor(string_to_encode, encoding_dict)12    return rotor(string_to_encode, encoding_dict)
1313
1414
15def rotor(string_to_encode: str, rotor_position: dict):15def rotor(string_to_encode: str, rotor_position: dict):
n16    """Encodes a String using the Key, Value Pairs in the dict"""n16    """Encodes a String using the Key, Value Pairs in the Dict."""
17    return "".join([rotor_position[ch] if ch in rotor_position else ch for ch in string_to_encode])17    return "".join([rotor_position.get(ch, ch) for ch in string_to_encode])
1818
1919
20def enigma_encrypt(plugboard_position: list, rotor_position: dict):20def enigma_encrypt(plugboard_position: list, rotor_position: dict):
n21    """Create a Decorator for a Function with the given positions using the Functions plugboard and rotor"""n21    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor."""
2222
23    def enigma_encrypt_decorator(func):23    def enigma_encrypt_decorator(func):
n24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""n24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it."""
2525
26        def decorated_func(s: str):26        def decorated_func(s: str):
n27            """Encrypt a String before calling a Function"""n27            """Encrypt a String before calling a Function."""
28            return func(rotor(plugboard(s, plugboard_position), rotor_position))28            return func(rotor(plugboard(s, plugboard_position), rotor_position))
2929
30        return decorated_func30        return decorated_func
3131
32    return enigma_encrypt_decorator32    return enigma_encrypt_decorator
3333
3434
35def enigma_decrypt(plugboard_position: list, rotor_position: dict):35def enigma_decrypt(plugboard_position: list, rotor_position: dict):
n36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""n36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor."""
37    flipped_rotor_position = dict([(y, x) for x, y in rotor_position.items()])37    rotor_position = {y: x for x, y in rotor_position.items()}
3838
39    def enigma_decrypt_decorator(func):39    def enigma_decrypt_decorator(func):
n40        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""n40        """Decorate a Function that excepts a single String, to decrypt the String before calling it."""
4141
42        def decorated_func(s: str):42        def decorated_func(s: str):
t43            """Decrypt a String before calling a Function"""t43            """Decrypt a String before calling a Function."""
44            return func(plugboard(rotor(s, flipped_rotor_position), plugboard_position))44            return func(plugboard(rotor(s, rotor_position), plugboard_position))
4545
46        return decorated_func46        return decorated_func
4747
48    return enigma_decrypt_decorator48    return enigma_decrypt_decorator
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op

f1def plugboard(string_to_encode: str, plugboard_position: list):f1def plugboard(string_to_encode: str, plugboard_position: list):
2    """Encode a String based on the Pairs of Chars in the List of Sets.2    """Encode a String based on the Pairs of Chars in the List of Sets.
33
4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.
5    This way it can use the rotor Function with the Plugboard's Position acting like a Rotor Position5    This way it can use the rotor Function with the Plugboard's Position acting like a Rotor Position
6    """6    """
77
8    tuple_pairs = list([tuple(pair) for pair in plugboard_position])8    tuple_pairs = list([tuple(pair) for pair in plugboard_position])
9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])
10    encoding_dict = dict(tuple_pairs)10    encoding_dict = dict(tuple_pairs)
1111
12    return rotor(string_to_encode, encoding_dict)12    return rotor(string_to_encode, encoding_dict)
1313
1414
15def rotor(string_to_encode: str, rotor_position: dict):15def rotor(string_to_encode: str, rotor_position: dict):
16    """Encodes a String using the Key, Value Pairs in the dict"""16    """Encodes a String using the Key, Value Pairs in the dict"""
17    return "".join([rotor_position[ch] if ch in rotor_position else ch for ch in string_to_encode])17    return "".join([rotor_position[ch] if ch in rotor_position else ch for ch in string_to_encode])
1818
1919
20def enigma_encrypt(plugboard_position: list, rotor_position: dict):20def enigma_encrypt(plugboard_position: list, rotor_position: dict):
t21    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor"""t21    """Create a Decorator for a Function with the given positions using the Functions plugboard and rotor"""
2222
23    def enigma_encrypt_decorator(func):23    def enigma_encrypt_decorator(func):
24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""
2525
26        def decorated_func(s: str):26        def decorated_func(s: str):
27            """Encrypt a String before calling a Function"""27            """Encrypt a String before calling a Function"""
28            return func(rotor(plugboard(s, plugboard_position), rotor_position))28            return func(rotor(plugboard(s, plugboard_position), rotor_position))
2929
30        return decorated_func30        return decorated_func
3131
32    return enigma_encrypt_decorator32    return enigma_encrypt_decorator
3333
3434
35def enigma_decrypt(plugboard_position: list, rotor_position: dict):35def enigma_decrypt(plugboard_position: list, rotor_position: dict):
36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""
37    flipped_rotor_position = dict([(y, x) for x, y in rotor_position.items()])37    flipped_rotor_position = dict([(y, x) for x, y in rotor_position.items()])
3838
39    def enigma_decrypt_decorator(func):39    def enigma_decrypt_decorator(func):
40        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""40        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""
4141
42        def decorated_func(s: str):42        def decorated_func(s: str):
43            """Decrypt a String before calling a Function"""43            """Decrypt a String before calling a Function"""
44            return func(plugboard(rotor(s, flipped_rotor_position), plugboard_position))44            return func(plugboard(rotor(s, flipped_rotor_position), plugboard_position))
4545
46        return decorated_func46        return decorated_func
4747
48    return enigma_decrypt_decorator48    return enigma_decrypt_decorator
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op

n1def plugboard(string_to_encode: str, encoding_list: list):n1def plugboard(string_to_encode: str, plugboard_position: list):
2    """Encode a String based on the Pairs of Chars in the List of Sets.2    """Encode a String based on the Pairs of Chars in the List of Sets.
33
4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.
n5    This way it can use the rotor Functionn5    This way it can use the rotor Function with the Plugboard's Position acting like a Rotor Position
6    """6    """
77
n8    tuple_pairs = list([tuple(curr_set) for curr_set in encoding_list])n8    tuple_pairs = list([tuple(pair) for pair in plugboard_position])
9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])
10    encoding_dict = dict(tuple_pairs)10    encoding_dict = dict(tuple_pairs)
1111
12    return rotor(string_to_encode, encoding_dict)12    return rotor(string_to_encode, encoding_dict)
1313
1414
n15def rotor(string_to_encode: str, encoding_dict: dict):n15def rotor(string_to_encode: str, rotor_position: dict):
16    """Encodes a String using the Key, Value Pairs in the dict"""16    """Encodes a String using the Key, Value Pairs in the dict"""
n17    return "".join([encoding_dict[ch] if ch in encoding_dict else ch for ch in string_to_encode])n17    return "".join([rotor_position[ch] if ch in rotor_position else ch for ch in string_to_encode])
1818
1919
20def enigma_encrypt(plugboard_position: list, rotor_position: dict):20def enigma_encrypt(plugboard_position: list, rotor_position: dict):
21    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor"""21    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor"""
2222
23    def enigma_encrypt_decorator(func):23    def enigma_encrypt_decorator(func):
24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""
2525
26        def decorated_func(s: str):26        def decorated_func(s: str):
27            """Encrypt a String before calling a Function"""27            """Encrypt a String before calling a Function"""
28            return func(rotor(plugboard(s, plugboard_position), rotor_position))28            return func(rotor(plugboard(s, plugboard_position), rotor_position))
2929
30        return decorated_func30        return decorated_func
3131
32    return enigma_encrypt_decorator32    return enigma_encrypt_decorator
3333
3434
35def enigma_decrypt(plugboard_position: list, rotor_position: dict):35def enigma_decrypt(plugboard_position: list, rotor_position: dict):
36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""
n37    rotor_position = dict([(y, x) for x, y in rotor_position.items()])n37    flipped_rotor_position = dict([(y, x) for x, y in rotor_position.items()])
3838
39    def enigma_decrypt_decorator(func):39    def enigma_decrypt_decorator(func):
40        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""40        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""
4141
42        def decorated_func(s: str):42        def decorated_func(s: str):
43            """Decrypt a String before calling a Function"""43            """Decrypt a String before calling a Function"""
t44            return func(plugboard(rotor(s, rotor_position), plugboard_position))t44            return func(plugboard(rotor(s, flipped_rotor_position), plugboard_position))
4545
46        return decorated_func46        return decorated_func
4747
48    return enigma_decrypt_decorator48    return enigma_decrypt_decorator
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op

n1def plugboard(string_to_encode: str, sets: list):n1def plugboard(string_to_encode: str, encoding_list: list):
2    """Encode a String based on the Pairs of Chars in the List of Sets"""2    """Encode a String based on the Pairs of Chars in the List of Sets.
33
tt4    This Function creates a Dict from the List of Pairs and extends it with the Swapped Pairs.
5    This way it can use the rotor Function
6    """
7 
4    tuple_pairs = list([tuple(curr_set) for curr_set in sets])8    tuple_pairs = list([tuple(curr_set) for curr_set in encoding_list])
5    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])9    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])
6    encoding_dict = dict(tuple_pairs)10    encoding_dict = dict(tuple_pairs)
711
8    return rotor(string_to_encode, encoding_dict)12    return rotor(string_to_encode, encoding_dict)
913
1014
11def rotor(string_to_encode: str, encoding_dict: dict):15def rotor(string_to_encode: str, encoding_dict: dict):
12    """Encodes a String using the Key, Value Pairs in the dict"""16    """Encodes a String using the Key, Value Pairs in the dict"""
13    return "".join([encoding_dict[ch] if ch in encoding_dict else ch for ch in string_to_encode])17    return "".join([encoding_dict[ch] if ch in encoding_dict else ch for ch in string_to_encode])
1418
1519
16def enigma_encrypt(plugboard_position: list, rotor_position: dict):20def enigma_encrypt(plugboard_position: list, rotor_position: dict):
17    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor"""21    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor"""
1822
19    def enigma_encrypt_decorator(func):23    def enigma_encrypt_decorator(func):
20        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""24        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""
2125
22        def decorated_func(s: str):26        def decorated_func(s: str):
23            """Encrypt a String before calling a Function"""27            """Encrypt a String before calling a Function"""
24            return func(rotor(plugboard(s, plugboard_position), rotor_position))28            return func(rotor(plugboard(s, plugboard_position), rotor_position))
2529
26        return decorated_func30        return decorated_func
2731
28    return enigma_encrypt_decorator32    return enigma_encrypt_decorator
2933
3034
31def enigma_decrypt(plugboard_position: list, rotor_position: dict):35def enigma_decrypt(plugboard_position: list, rotor_position: dict):
32    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""36    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""
33    rotor_position = dict([(y, x) for x, y in rotor_position.items()])37    rotor_position = dict([(y, x) for x, y in rotor_position.items()])
3438
35    def enigma_decrypt_decorator(func):39    def enigma_decrypt_decorator(func):
36        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""40        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""
3741
38        def decorated_func(s: str):42        def decorated_func(s: str):
39            """Decrypt a String before calling a Function"""43            """Decrypt a String before calling a Function"""
40            return func(plugboard(rotor(s, rotor_position), plugboard_position))44            return func(plugboard(rotor(s, rotor_position), plugboard_position))
4145
42        return decorated_func46        return decorated_func
4347
44    return enigma_decrypt_decorator48    return enigma_decrypt_decorator
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op

f1def plugboard(string_to_encode: str, sets: list):f1def plugboard(string_to_encode: str, sets: list):
2    """Encode a String based on the Pairs of Chars in the List of Sets"""2    """Encode a String based on the Pairs of Chars in the List of Sets"""
33
4    tuple_pairs = list([tuple(curr_set) for curr_set in sets])4    tuple_pairs = list([tuple(curr_set) for curr_set in sets])
5    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])5    tuple_pairs.extend([(y, x) for x, y in tuple_pairs])
6    encoding_dict = dict(tuple_pairs)6    encoding_dict = dict(tuple_pairs)
77
8    return rotor(string_to_encode, encoding_dict)8    return rotor(string_to_encode, encoding_dict)
99
1010
11def rotor(string_to_encode: str, encoding_dict: dict):11def rotor(string_to_encode: str, encoding_dict: dict):
12    """Encodes a String using the Key, Value Pairs in the dict"""12    """Encodes a String using the Key, Value Pairs in the dict"""
n13    return "".join([encoding_dict[ch] for ch in string_to_encode])n13    return "".join([encoding_dict[ch] if ch in encoding_dict else ch for ch in string_to_encode])
1414
1515
16def enigma_encrypt(plugboard_position: list, rotor_position: dict):16def enigma_encrypt(plugboard_position: list, rotor_position: dict):
17    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor"""17    """Create a Decorator for a Function with the given parameters using the Functions plugboard and rotor"""
1818
19    def enigma_encrypt_decorator(func):19    def enigma_encrypt_decorator(func):
20        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""20        """Decorate an Encrypting Function that excepts a single String, to encrypt the String before calling it"""
2121
22        def decorated_func(s: str):22        def decorated_func(s: str):
23            """Encrypt a String before calling a Function"""23            """Encrypt a String before calling a Function"""
24            return func(rotor(plugboard(s, plugboard_position), rotor_position))24            return func(rotor(plugboard(s, plugboard_position), rotor_position))
2525
26        return decorated_func26        return decorated_func
2727
28    return enigma_encrypt_decorator28    return enigma_encrypt_decorator
2929
3030
31def enigma_decrypt(plugboard_position: list, rotor_position: dict):31def enigma_decrypt(plugboard_position: list, rotor_position: dict):
32    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""32    """Create a Decrypting Decorator for a Function with the given positions using the Functions plugboard and rotor"""
33    rotor_position = dict([(y, x) for x, y in rotor_position.items()])33    rotor_position = dict([(y, x) for x, y in rotor_position.items()])
3434
35    def enigma_decrypt_decorator(func):35    def enigma_decrypt_decorator(func):
36        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""36        """Decorate a Function that excepts a single String, to decrypt the String before calling it"""
3737
38        def decorated_func(s: str):38        def decorated_func(s: str):
39            """Decrypt a String before calling a Function"""39            """Decrypt a String before calling a Function"""
40            return func(plugboard(rotor(s, rotor_position), plugboard_position))40            return func(plugboard(rotor(s, rotor_position), plugboard_position))
4141
42        return decorated_func42        return decorated_func
4343
44    return enigma_decrypt_decorator44    return enigma_decrypt_decorator
t45 t
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op