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