import ast import js def blätterfestlegen(text): blätter = [] for t in set(text): anzahl = text.count(t) blätter.append([t, anzahl]) return blätter def sortieren(liste): for x in range(len(liste)): for y in range(len(liste)-1): if liste[y][1] < liste[y+1][1]: liste[y], liste[y+1] = liste[y+1], liste[y] elif liste[y][1] == liste[y+1][1]: if len(liste[y][0]) < len(liste[y+1][0]): liste[y], liste[y+1] = liste[y+1], liste[y] elif len(liste[y][0]) == len(liste[y+1][0]): if liste[y][0] > liste[y+1][0]: liste[y], liste[y+1] = liste[y+1], liste[y] return liste def baumfestlegen(liste): baum = {} for x in range(len(liste)-1, 0, -1): blätter = sortieren(liste) #Namensvergebung der Überpunkte in absteigender Reihenfolge, sodass 'P1' immer die Wurzel wird name = 'P' + str(x) anzahl = blätter[-1][1] + blätter[-2][1] #Überpunkt zu Baum hinzufügen, beide Unterpunkte(/Nachfolger) aus der Blätterliste entfernen, Überpunkt dort einfügen baum[name] = [blätter.pop(-1), blätter.pop(-1)] blätter.append([name, anzahl]) for y in baum: #Anhängen einer 0 (links) oder 1 (rechts) für jeden Pfad baum[y][0].append('0') baum[y][1].append('1') #Baum in umgekehrter Reihenfolge zurückgeben, sodass die Wurzel vorne steht return (dict(reversed(list(baum.items())))) def charverschlüsseln(baum, zeichen, wurzel, code): if zeichen == wurzel: #Ziel erreicht, angesammelten Code rückwärts zurückgeben (Baum wurde rückwärts durchlaufen) return code[::-1] else: for x in baum: for y in range(2): #Suche nach Überpunkt des gesuchten Zeichens -> Baum wird rückwärts, also von unten nach oben, durchlaufen, um rekursive Abfragen - und damit Leistung - zu sparen if baum[x][y][0] == zeichen: #Ziffer (0 oder 1) wird dem Code angehängt code += str(baum[x][y][2]) return charverschlüsseln(baum, x, wurzel, code) #Verschlüsselt Texte, Zeichen für Zeichen def textverschlüsseln(baum, text, wurzel): ausgabe = '' for t in text: ausgabe += charverschlüsseln(baum, t, wurzel, '') return ausgabe def knoten_einschreiben(name, parent, count, codierung): if name == ' ': name = '(space)' return [name, parent, count, codierung] googlebaum = [] def baumleeren(): global googlebaum googlebaum.clear() def baumzeichnen(baumdict, name, parent, count, codierung): global googlebaum googlebaum.append(knoten_einschreiben(name, parent, count, codierung)) if(name[0] =='P'): baumzeichnen(baumdict, baumdict[name][0][0], name, baumdict[name][0][1], baumdict[name][0][2]) baumzeichnen(baumdict, baumdict[name][1][0], name, baumdict[name][1][1], baumdict[name][1][2]) textbox = Element("text-content") output = Element("output-text") output_raw = Element("output-text-raw") def sub(*args,**kwargs): if len(textbox.value)>1: if textbox.value.count(textbox.value[0]) != len(textbox.value): if textbox.value.find(",") == -1 and textbox.value.find("<") == -1 and textbox.value.find(">") == -1 and textbox.value.find("=") == -1: baumleeren() codierung(textbox.value) output_raw.write('"' + textbox.value + '"') textbox.clear() js.malen(str(googlebaum)) else: output.write("Notice: The text can't contain commas or (in)equality signs") else: output.write("Notice: The text needs at least two different characters") else: output.write("Notice: The text has to be more than one character") def codierung(text): binärbaum = baumfestlegen(blätterfestlegen(text)) schlüsseltext = textverschlüsseln(binärbaum, text, 'P1') baumzeichnen(binärbaum, 'P1', '', binärbaum['P1'][0][1] + binärbaum['P1'][1][1], '') output.write(schlüsseltext) def key_event(e): if e.key == "Enter": sub() textbox.element.onkeypress = key_event

TRY ONLINE

See for yourself how it works!

Enter any text below and witness how it gets encoded after pressing the button.

Additionally, the belonging binary tree will be visualized.

Encoded text will appear here...