Домашни > Енигма > Решения > Решението на Мартин Гоцев

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

10 точки общо

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

 1def plugboard(input_str, connections):
 2    plugboard_dict = {}
 3    for connection in connections:
 4        letter1, letter2 = connection
 5        plugboard_dict[letter1] = letter2
 6        plugboard_dict[letter2] = letter1
 7
 8    output_str = ""
 9    for letter in input_str:
10        if letter in plugboard_dict:
11            output_str += plugboard_dict[letter]
12        else:
13            output_str += letter
14
15    return output_str
16
17
18def rotor(input_str, rotor_dict):
19    result = ""
20    for letter in input_str:
21        result += rotor_dict.get(letter, letter)
22    return result
23
24
25def enigma_encrypt(plugboard_position, rotor_position):
26    def decorator(func_e):
27        def str_encrypt(str_e):
28            str_e = plugboard(str_e, plugboard_position)
29            str_e = rotor(str_e, rotor_position)
30            return func_e(str_e)
31        return str_encrypt
32    return decorator
33
34def enigma_decrypt(plugboard_position, rotor_position):
35    def decorator(func_d):
36        def str_decrypt(str_d):
37            str_d = rotor(str_d, {v: k for k, v in rotor_position.items()})
38            str_d = plugboard(str_d, plugboard_position)
39            return func_d(str_d)
40        return str_decrypt
41    return decorator
42
43plugboard_position = [{'a', 'c'}, {'t', 'z'}]
44rotor_position = {'v': 'd', 'd': 'v', 'y': 'u', 'n': 'n', 'i': 'w', 'z': 'p',
45                  's': 'e', 'x': 's', 'h': 'f', 'b': 'x', 'u': 'c', 'p': 'q',
46                  'r': 'g', 'q': 'j', 'e': 't', 'l': 'y', 'o': 'z', 'g': 'o',
47                  'k': 'b', 't': 'h', 'j': 'm', 'a': 'a', 'w': 'i', 'f': 'l',
48                  'm': 'r', 'c': 'k'}
49
50rotor('enigma', rotor_position) # tnwora
51plugboard('enigma', plugboard_position) # enigmc
52
53encryptor = enigma_encrypt(plugboard_position=plugboard_position,
54                           rotor_position=rotor_position)
55decryptor = enigma_decrypt(plugboard_position=plugboard_position,
56                           rotor_position=rotor_position)
57
58encrypt_print = encryptor(print)
59decrypt_print = decryptor(print)
60
61encrypt_print('enigma') # tnwork
62decrypt_print('tnwork') # enigma

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

OK

Дискусия
История

f1def plugboard(input_str, connections):f1def plugboard(input_str, connections):
2    plugboard_dict = {}2    plugboard_dict = {}
3    for connection in connections:3    for connection in connections:
4        letter1, letter2 = connection4        letter1, letter2 = connection
5        plugboard_dict[letter1] = letter25        plugboard_dict[letter1] = letter2
6        plugboard_dict[letter2] = letter16        plugboard_dict[letter2] = letter1
77
8    output_str = ""8    output_str = ""
9    for letter in input_str:9    for letter in input_str:
10        if letter in plugboard_dict:10        if letter in plugboard_dict:
11            output_str += plugboard_dict[letter]11            output_str += plugboard_dict[letter]
12        else:12        else:
13            output_str += letter13            output_str += letter
1414
15    return output_str15    return output_str
1616
1717
18def rotor(input_str, rotor_dict):18def rotor(input_str, rotor_dict):
19    result = ""19    result = ""
20    for letter in input_str:20    for letter in input_str:
21        result += rotor_dict.get(letter, letter)21        result += rotor_dict.get(letter, letter)
22    return result22    return result
2323
2424
25def enigma_encrypt(plugboard_position, rotor_position):25def enigma_encrypt(plugboard_position, rotor_position):
n26    def decorator(func):n26    def decorator(func_e):
27        def str_encrypt(str):27        def str_encrypt(str_e):
28            str = plugboard(str, plugboard_position)28            str_e = plugboard(str_e, plugboard_position)
29            str = rotor(str, rotor_position)29            str_e = rotor(str_e, rotor_position)
30            return func(str)30            return func_e(str_e)
31        return str_encrypt31        return str_encrypt
32    return decorator32    return decorator
3333
34def enigma_decrypt(plugboard_position, rotor_position):34def enigma_decrypt(plugboard_position, rotor_position):
t35    def decorator(func):t35    def decorator(func_d):
36        def str_decrypt(str):36        def str_decrypt(str_d):
37            str = rotor(str, {v: k for k, v in rotor_position.items()})37            str_d = rotor(str_d, {v: k for k, v in rotor_position.items()})
38            str = plugboard(str, plugboard_position)38            str_d = plugboard(str_d, plugboard_position)
39            return func(str)39            return func_d(str_d)
40        return str_decrypt40        return str_decrypt
41    return decorator41    return decorator
4242
43plugboard_position = [{'a', 'c'}, {'t', 'z'}]43plugboard_position = [{'a', 'c'}, {'t', 'z'}]
44rotor_position = {'v': 'd', 'd': 'v', 'y': 'u', 'n': 'n', 'i': 'w', 'z': 'p',44rotor_position = {'v': 'd', 'd': 'v', 'y': 'u', 'n': 'n', 'i': 'w', 'z': 'p',
45                  's': 'e', 'x': 's', 'h': 'f', 'b': 'x', 'u': 'c', 'p': 'q',45                  's': 'e', 'x': 's', 'h': 'f', 'b': 'x', 'u': 'c', 'p': 'q',
46                  'r': 'g', 'q': 'j', 'e': 't', 'l': 'y', 'o': 'z', 'g': 'o',46                  'r': 'g', 'q': 'j', 'e': 't', 'l': 'y', 'o': 'z', 'g': 'o',
47                  'k': 'b', 't': 'h', 'j': 'm', 'a': 'a', 'w': 'i', 'f': 'l',47                  'k': 'b', 't': 'h', 'j': 'm', 'a': 'a', 'w': 'i', 'f': 'l',
48                  'm': 'r', 'c': 'k'}48                  'm': 'r', 'c': 'k'}
4949
50rotor('enigma', rotor_position) # tnwora50rotor('enigma', rotor_position) # tnwora
51plugboard('enigma', plugboard_position) # enigmc51plugboard('enigma', plugboard_position) # enigmc
5252
53encryptor = enigma_encrypt(plugboard_position=plugboard_position,53encryptor = enigma_encrypt(plugboard_position=plugboard_position,
54                           rotor_position=rotor_position)54                           rotor_position=rotor_position)
55decryptor = enigma_decrypt(plugboard_position=plugboard_position,55decryptor = enigma_decrypt(plugboard_position=plugboard_position,
56                           rotor_position=rotor_position)56                           rotor_position=rotor_position)
5757
58encrypt_print = encryptor(print)58encrypt_print = encryptor(print)
59decrypt_print = decryptor(print)59decrypt_print = decryptor(print)
6060
61encrypt_print('enigma') # tnwork61encrypt_print('enigma') # tnwork
62decrypt_print('tnwork') # enigma62decrypt_print('tnwork') # enigma
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op

n1def plugboard(str, connections):n1def plugboard(input_str, connections):
2    dict = {}2    plugboard_dict = {}
3    for connection in connections:3    for connection in connections:
n4        letters = list(connection)n4        letter1, letter2 = connection
5        dict[letters[0]] = letters[1]
6        dict[letters[1]] = letters[0]5        plugboard_dict[letter1] = letter2
6        plugboard_dict[letter2] = letter1
77
n8    read = ""n8    output_str = ""
9    for letter in str:9    for letter in input_str:
10       
11        if letter in dict:10        if letter in plugboard_dict:
12            read += dict[letter]11            output_str += plugboard_dict[letter]
13        else:12        else:
n14            read += lettern13            output_str += letter
1514
n16    return readn15    return output_str
1716
nn17 
18def rotor(str, dict):18def rotor(input_str, rotor_dict):
19    result = ""19    result = ""
t20    for letter in str:t20    for letter in input_str:
21        if letter in dict:21        result += rotor_dict.get(letter, letter)
22            result += dict[letter]
23        else:
24            result += letter
25    return result22    return result
2623
2724
28def enigma_encrypt(plugboard_position, rotor_position):25def enigma_encrypt(plugboard_position, rotor_position):
29    def decorator(func):26    def decorator(func):
30        def str_encrypt(str):27        def str_encrypt(str):
31            str = plugboard(str, plugboard_position)28            str = plugboard(str, plugboard_position)
32            str = rotor(str, rotor_position)29            str = rotor(str, rotor_position)
33            return func(str)30            return func(str)
34        return str_encrypt31        return str_encrypt
35    return decorator32    return decorator
3633
37def enigma_decrypt(plugboard_position, rotor_position):34def enigma_decrypt(plugboard_position, rotor_position):
38    def decorator(func):35    def decorator(func):
39        def str_decrypt(str):36        def str_decrypt(str):
40            str = rotor(str, {v: k for k, v in rotor_position.items()})37            str = rotor(str, {v: k for k, v in rotor_position.items()})
41            str = plugboard(str, plugboard_position)38            str = plugboard(str, plugboard_position)
42            return func(str)39            return func(str)
43        return str_decrypt40        return str_decrypt
44    return decorator41    return decorator
4542
46plugboard_position = [{'a', 'c'}, {'t', 'z'}]43plugboard_position = [{'a', 'c'}, {'t', 'z'}]
47rotor_position = {'v': 'd', 'd': 'v', 'y': 'u', 'n': 'n', 'i': 'w', 'z': 'p',44rotor_position = {'v': 'd', 'd': 'v', 'y': 'u', 'n': 'n', 'i': 'w', 'z': 'p',
48                  's': 'e', 'x': 's', 'h': 'f', 'b': 'x', 'u': 'c', 'p': 'q',45                  's': 'e', 'x': 's', 'h': 'f', 'b': 'x', 'u': 'c', 'p': 'q',
49                  'r': 'g', 'q': 'j', 'e': 't', 'l': 'y', 'o': 'z', 'g': 'o',46                  'r': 'g', 'q': 'j', 'e': 't', 'l': 'y', 'o': 'z', 'g': 'o',
50                  'k': 'b', 't': 'h', 'j': 'm', 'a': 'a', 'w': 'i', 'f': 'l',47                  'k': 'b', 't': 'h', 'j': 'm', 'a': 'a', 'w': 'i', 'f': 'l',
51                  'm': 'r', 'c': 'k'}48                  'm': 'r', 'c': 'k'}
5249
53rotor('enigma', rotor_position) # tnwora50rotor('enigma', rotor_position) # tnwora
54plugboard('enigma', plugboard_position) # enigmc51plugboard('enigma', plugboard_position) # enigmc
5552
56encryptor = enigma_encrypt(plugboard_position=plugboard_position,53encryptor = enigma_encrypt(plugboard_position=plugboard_position,
57                           rotor_position=rotor_position)54                           rotor_position=rotor_position)
58decryptor = enigma_decrypt(plugboard_position=plugboard_position,55decryptor = enigma_decrypt(plugboard_position=plugboard_position,
59                           rotor_position=rotor_position)56                           rotor_position=rotor_position)
6057
61encrypt_print = encryptor(print)58encrypt_print = encryptor(print)
62decrypt_print = decryptor(print)59decrypt_print = decryptor(print)
6360
64encrypt_print('enigma') # tnwork61encrypt_print('enigma') # tnwork
65decrypt_print('tnwork') # enigma62decrypt_print('tnwork') # enigma
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op