Ein gewisser Anspruch kommt in die Aufgabe, weil die Verschiebung über den beigegebenen Schlüssel ermittelt werden soll. Eigentlich müsste man hier eine Dechiffrierung über die Buchstabenhäufigkeit erreichen können, andererseits gibt es hierfür zu wenig Material. Nach einiger Zeit (5. Februar 2013) habe ich jetzt eine lauffähige Lösung für das Problem gecodet:
''' Coderian Cipher - HP codewars 2012
Beschreibung: Loesung fuer das Problem Nr. 9 von HP codewars 2012
Version: 1. Loesung, 1. Ansatz
Autor: Pixewakb, pixewakb@gmail.com
Startdatum: 04.02.2013
Enddatum: 05.02.2013
Letzte Bearb.: 05.02.2013
Probleme: Das Skript duerfte einiges an Optimierungspotential haben
'''
message ="XYVOIC ERH FSCWIRFIVVC SR VCI AMXL E WMHI SJ XYRE WEPEH KEY YONR"
def dechiffrieren(message):
''' Erledigt das vollstaendige Dechiffrieren
und gibt die decodierte Message zurueck
'''
# Variablen und Messsage splitten
verschiebung = 0 # beruecksichtigt nur eine positive Verschiebung (!)
text,keyword = message.split(" KEY ")
# Text zurichten
text = text.upper().replace(" ","")
# Jetzt muss die Verschiebung ermittelt werden
# (1) Berechne für jeden Buchstaben a in text eine Verschiebung
# (2) Pruefe die Verschiebung anhand des Schluesselwortes
# (3) Wenn Pruefung gelingt, dann stoppe das und gib die Verschiebung raus
for i,a in enumerate(text):
# a - verschluesselter Buchstabe
# b - entschluesselter Buchstabe
b = keyword[0]
# print(ord(a),ord(b),sep=" - ",end=";")
if ord(a) > ord(b):
verschiebung = ord(a) - ord(b)
# print(verschiebung)
elif ord(a) < ord(b):
verschiebung = -1 * (90 - ord(b) + ord(a) - 64)
# print(verschiebung)
else:
verschiebung = 0
# print(verschiebung)
# Verschiebung wird bereits korrekt mit -4 ermittelt (!)
# Pruefe, ob die Verschiebung zum Keyword passt,
# sonst weiterpruefen
# Ermittle die Sequenz :D
testword = text[i:i+4]
# Das Testword wird mittels Verschiebung umgetauscht und
# gegen das keyword geprueft, wenn testword == keyword, dann
# return verschiebung (!)
test = []
for a in testword:
if ord(a) + verschiebung < ord("A"):
wert = chr(ord(a) + verschiebung + 26)
elif ord(a) + verschiebung > ord("Z"):
wert = chr(ord(a) + verschiebung - 26)
else:
wert = chr(ord(a) + verschiebung)
test.append(wert)
# print(test,keyword)
if "".join(test) == keyword:
print("Verschiebung gefunden! >>>",verschiebung)
break
# Verschiebung - der Wert sollte berechnet werden (!) :-((
# verschiebung = -4 # Muss Negativ sein (!)
# Dechiffriere mit der Verschiebung den Satz
# und gib das Ergebnis zurueck!
result = []
for a in message[:-9]:
if a == " ":
pass
elif ord(a) + verschiebung < ord("A"):
a = chr(ord(a) + verschiebung + 26)
elif ord(a) + verschiebung > ord("Z"):
a = chr(ord(a) + verschiebung - 26)
else:
a = chr(ord(a) + verschiebung)
result.append(a)
return "".join(result)
print(dechiffrieren(message))
Problem aus meiner Sicht ist, dass mir der Quelltext etwas lang vorkommt und es wahrscheinlich noch deutliches Optimierungspotential gibt.
Keine Kommentare:
Kommentar veröffentlichen