Samstag, 19. Januar 2013

Coderian Cipher

Betrachtet man das Problem 9 (2012) bei HP Codewars, so erkennt man schnell, dass es sich letztlich um eine Caesar-Verschlüsselung handelt, mit der ich mich bereits einmal befasst habe und die zunächst einmal nicht sonderlich anspruchsvoll ist.

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