Leetspeak

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Wieder ein mal tut eines meiner Programme nicht das was es soll. Es soll nämlich einen String in Leetspeak entschlüsseln. Ich hab es mal durch getestet es kann jeden Buchstaben aus dem dictionary entschlüsseln, aber wenn der String länger ist als 4 Byte wird das 5 Byte verschluckt. Entschuldigt bitte das der Code (wieder einmal) nicht schön ist aber ich musste einfach rumprobieren.

Der Code:

Code: Alles auswählen

character2leet_speak={'a': '4', 'b': '|3', 'c': '<', 'd': '|)', 'e': '3', 'f': 'f', 'g': '6',
         'h': '|-|', 'i': '!', 'j': 'j', 'k': '|<', 'l': '1', 'm': '|\/|', 'n': '|/|',
         'o': '0', 'p': '|*', 'q': 'q', 'r': '|2', 's': '5', 't': '+', 'u': '|_|',
         'v': '\\/', 'w': '\\/\\/', 'x': 'x', 'y': 'y', 'z': '2', '!': '°!', '?': '°?'}

def find_longest_translation(dic):
    maxlen=0
    for i in dic:
        if len(str(dic[i]))>maxlen:
            maxlen=len(str(dic[i]))
    return maxlen

def inverted_dict(dictionary):              
    return dict((v, k) for k, v in dictionary.items())

def encrypt_leetcode(string, codedic=None):
    global character2leet_speak
    leetcode=''
    if codedic is None:
        codedic=character2leet_speak
    for letter in string.lower():
        if letter in codedic:
            leetcode+=codedic[letter]
        else:
            leetcode+=letter
    return leetcode

def decode_leetcode(string, codedic=None):
    global character2leet_speak
    if codedic is None:           #Wenn codedic nicht angegeben ist,
        codedic=character2leet_speak           #wird das standartd dictionary hergenommen.
    normaltext=''
    memory=''
    maxlen=find_longest_translation(codedic)
    codedic=inverted_dict(codedic)
    for letter in string:
        if len(memory)<maxlen:    #ueberprueft ob der Speicher vollgeschrieben ist, wenn nicht wird er vollgeschrieben
            print(memory)
            memory+=letter
            continue                #verhindert das ausführen des folgenden code bis der Speicher voll ist
        for i in range(maxlen):
            print('\t'+str(memory[0: len(memory)-i]))
            if memory[0: len(memory)-i] in codedic:
                normaltext+=codedic[memory[0: len(memory)-i]]
                print('\t\t'+normaltext)
                memory=memory[len(memory)-i:]
                break
            elif i == maxlen-1:
                print('unbekantes Zeichen identifiziert')
                normaltext+=memory[0: 1]
                print('\t\t'+normaltext)
                memory=memory[1:]
                break
    if len(memory)>0:
        print('noch nicht fehrtig')
        print(memory)
        for letter in memory:
            for i in range(maxlen):
                print('\t'+str(memory[0: len(memory)-i]))
                if memory[0: len(memory)-i] in codedic:
                    normaltext+=codedic[memory[0: len(memory)-i]]
                    print('\t\t'+normaltext)
                    memory=memory[len(memory)-i:]
                    break
                elif i == maxlen-1:
                    print('unbekantes Zeichen identifiziert')
                    normaltext+=memory[0: 1]
                    print('\t\t'+normaltext)
                    memory=memory[1:]
                    break
    return normaltext

if __name__ == '__main__':
        print(decode_leetcode('|-|4110'))
Ausgabe:

Code: Alles auswählen

|
|-
|-|
	|-|4
	|-|
		       h
4
41
noch nicht fehrtig
410
	410
	41
	4
		       ha
	10
	1
		       hal
	0
		       halo
halo
Ich hab mal im Code ein Paar print() Anweisungen eingebaut um zusehen was das Skript macht.
Ohne tab: memory auffüllen
ein tab: memory auf Zeichen durchsuchen
zwei tabs: ausgabe des erkannten Zeichens
Zuletzt geändert von Py-Prog am Montag 10. Januar 2011, 17:29, insgesamt 1-mal geändert.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Der Code ist wirklich nicht schön zu Überblicken, könntest du wenigsten deinen Ansatz, wie du es entschlüsseln willst etwas genauer beschreiben ?


@moderator
Eventuell könnte man den Thread hier mit anhängen http://www.python-forum.de/viewtopic.php?f=9&t=25169
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@Py-Prog: Geh das ganze doch einmal "von Hand" Schritt für Schritt durch. Also Spiel selber mal Python-Interpreter. Dann solltest Du die Stelle finden an der das Problem liegt.

Ansonsten ist die Namensgebung nicht immer so toll. Wenn ein Kommentar einen Namen erklären muss, dann sollte man überlegen den Namen so zu ändern, dass man keinen Kommentar mehr benötigt. `find_max_len()` könnte man zum Beispiel in `find_longest_translation()` umbenennen. Ebenso ist `dic` nicht nur eine schlechte Abkürzung für "dictionary" sondern sagt auch überhaupt nichts über die *Bedeutung* des Objekts aus, was sich dahinter verbirgt. Bei `find_longest_translation()` könnte es zum Beispiel `character2leet_speak` heissen.

Die Funktion selbst liesse sich deutlich kürzer mit `max()` schreiben (ungetestet):

Code: Alles auswählen

def find_longest_translation(character2leet_speak):
    return max(character2leet_speak.itervalues(), key=len)
`dic_inverted()` ist auch ein wenig zu umständlich geschrieben. Man kann gleich über Schlüssel *und* Wert iterieren (ungetestet):

Code: Alles auswählen

def inverted_dict(dictionary):
    return dict((v, k) for k, v in dictionary.iteritems())
``global`` ist in beiden Fällen nicht nötig und Namen für Konstanten werden per Konvention komplett in Grossbuchstaben geschrieben.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

@Xynon1 dein Code ist VIEL besser, ich über lege mir ob ich ihn hernehme.
Beim entschlüsseln gehe ich eigentlich genau so vor wie du.

@BlackJack Wenn ich den Python-Interpreter spiele bekomme ich einen BrainError, nein ich finde den Fehler einfach nicht.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Antworten