Проблемы с реализацией плагина для сборки загадки в python
Это было необязательным упражнением для создания загадочной машины для школьных занятий в университете. Было несколько шагов для наведения (сначала я должен был реализовать одно вращающееся колесо, затем 3 из них, после этого я должен был реализовать отражатель, затем возможность установить начальную позицию для колес). До этого момента все шло хорошо (проходило все тесты), но когда я попытался реализовать плагин (Steckerbrett), моя сборка не прошла тест, и после нескольких часов поиска ошибки (которую я не смог найти) я прошу вас Помоги мне.
Вот мой код (обратите внимание, что я все еще новичок и что мой код может быть не самым подходящим):
#Enigma build (everything included)
class Enigma:
def __init__(self, wheels, reflector, starting_position, plugs, message):
self.message = message
self.wheels = Wheels(wheels, starting_position)
self.reflector = reflector
self.plugboard = Plugboard(plugs)
self.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
self.wheels.set_starting_position()
def execute(self):
output = ""
self.message = self.plugboard.forward(self.message)
for char in self.message:
if char in self.alphabet:
coded_char = char
if coded_char in self.plugboard.plugs_forward:
coded_char = self.plugboard.plugs_forward[coded_char]
coded_char = coding_forward(coded_char, self.alphabet, self.wheels.wheel1)
coded_char = coding_forward(coded_char, self.alphabet, self.wheels.wheel2)
coded_char = coding_forward(coded_char, self.alphabet, self.wheels.wheel3)
coded_char = coding_forward(coded_char, self.alphabet, self.reflector)
coded_char = coding_backward(coded_char, self.alphabet, self.wheels.wheel3)
coded_char = coding_backward(coded_char, self.alphabet, self.wheels.wheel2)
coded_char = coding_backward(coded_char, self.alphabet, self.wheels.wheel1)
output = "".join([output, coded_char])
self.wheels.rotate()
output = self.plugboard.backward(output)
return output
class Wheels:
def __init__(self, wheels, position):
self.wheel1 = wheels[0]
self.wheel2 = wheels[1]
self.wheel3 = wheels[2]
self.position = position
self.rotation_counter = 0
def rotate(self):
self.rotation_counter += 1
self.wheel1 = "".join([self.wheel1[1:], self.wheel1[0]])
if self.rotation_counter % 26 == 0:
self.wheel2 = "".join([self.wheel2[1:], self.wheel2[0]])
if self.rotation_counter % 676 == 0:
self.wheel3 = "".join([self.wheel3[1:], self.wheel3[0]])
self.rotation_counter = 0
def set_starting_position(self):
turn1 = ord(self.position[0]) - ord('A')
self.wheel1 = "".join([self.wheel1[turn1:],self.wheel1[:turn1]])
turn2 = ord(self.position[1]) - ord('A')
self.wheel2 = "".join([self.wheel2[turn2:],self.wheel2[:turn2]])
turn3 = ord(self.position[2]) - ord('A')
self.wheel3 = "".join([self.wheel3[turn3:],self.wheel3[:turn3]])
class Plugboard:
def __init__(self, plugs):
self.plugs_forward = {a:b for a,b in plugs}
self.plugs_backward = {b:a for a,b in plugs}
def forward(self, string):
output = []
for char in string:
if char in self.plugs_forward:
output.append(self.plugs_forward[char])
else:
output.append(char)
return "".join(output)
def backward(self, string):
output = []
for char in string:
if char in self.plugs_backward:
output.append(self.plugs_backward[char])
else:
output.append(char)
return "".join(output)
def coding_forward(char, wheel_side_1, wheel_side_2):
coded_char = ""
char_ix = wheel_side_1.index(char)
coded_char = wheel_side_2[char_ix]
return coded_char
def coding_backward(char, wheel_side_1, wheel_side_2):
coded_char = ""
char_ix = wheel_side_2.index(char)
coded_char = wheel_side_1[char_ix]
return coded_char
user_input = input()
newEnigma = Enigma(["QOFJSPIRUTNLMXWBZEGYKCADVH","ZHQYASLFCTRPKUWDVBIMJXGOEN", "JQBVTIEUXANMYDKPSWLZHGFROC"],
"YRUHQSLDPXNGOKMIEBFZCWVJAT", "KEY", ["QA", "HJ", "KI", "EV", "GC", "PO", "LK", "NX", "AS", "TE"], user_input)
print(newEnigma.execute())
Теперь это "EGJTUABUVJWZCYURYOIDFZZKHZCWQQGMKTTTNADFMBNFOQXTSDGANPROIWLLBZJVRXIRQAINSHCURXQLPK" в виде одной длинной строки должно давать английское предложение (конечно, только с заглавными буквами и без пробелов)
Спасибо за ответы заранее!
1 ответ
Вы подключили несколько штекеров E
& A
в вашем plugboard settings
вход; Я думаю, что это может создать ваши проблемы.
["QA", "HJ", "KI", "EV", "GC", "PO", "LK", "NX", "AS", "TE"]
^A ^E ^A ^E
Возможно, вы захотите убедиться, что входы панели управления соответствуют требованиям.
Вот подход, чтобы сделать это:
def verify_plugs(plug_connections):
seen = set([letter for pairs in plug_connections for letter in pairs])
return len(seen) == len(plug_connections) * 2
plug_connections = ["QA", "HJ", "KI", "EV", "GC", "PO", "LK", "NX", "AS", "TE"]
verify_plugs(plug_connections)
выход:
False