Morsebaum Implementierung

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
johnny223
User
Beiträge: 2
Registriert: Mittwoch 3. März 2021, 02:55

Hallo zusammen,

ich habe eine Frage zu einem Beispiel (siehe Link:https://ibb.co/rmjqXfN)

Dies ist der Code der Angabe:

Code: Alles auswählen

 class MorseSymbol:
    def __init__(self, v):
        self.value = v
        self.left = None
        self.right = None

    
class MorseTree:
    def __init__(self):
        self.start = MorseSymbol(None)

    def add(self, value, morseCode):
        self.add_symbol(self.start, value, morseCode)

  
    def add_symbol(self, sym, value, morseCode):
        if sym == None:
            sym = MorseSymbol(None)
        
        if not morseCode:
            sym.value = value
            return sym
        
        # YOUR CODE HERE #

        return sym

    def decode(self, sym, code, current):
        # YOUR CODE HERE #
        pass
    
    def decode_list(self, codes):
        sb = ""
        for code in codes:
            sb += self.decode(self.start, code, 0)
        return sb


m = MorseTree()
m.add('E', ".")
m.add('T', "_")
m.add('I', "..")
m.add('A', "._")
m.add('N', "_.")
m.add('M', "__")
  
assert m.decode_list(["_", ".", "._"]) == "TEA" 
Hier ist der Code inklusive einer Lösung:

Code: Alles auswählen

class MorseSymbol:
    def __init__(self, v):
        self.value = v
        self.left = None
        self.right = None


class MorseTree:
    def __init__(self):
        self.start = MorseSymbol(None)

    def add(self, value, morseCode):
        self.add_symbol(self.start, value, morseCode)

    def add_symbol(self, sym, value, morseCode):
        if sym == None:
            sym = MorseSymbol(None)

        if not morseCode:
            sym.value = value
            return sym

        # YOUR CODE HERE #

        left = True
        for c in morseCode:
            last_sym = sym
            if c == '.':
                sym = sym.left
                left = True
            if c == '_':
                sym = sym.right
                left = False

        newSym = MorseSymbol(value)

        if left:
            last_sym.left = newSym
        else:
            last_sym.right = newSym

        return sym

    def decode(self, sym, code, current):

        if len(code) == 0:
            return ""

        for c in code:
            if c == '.':
                sym = sym.left
            if c == '_':
                sym = sym.right

        return str(sym.value)

    def decode_list(self, codes):
        sb = ""
        for code in codes:
            sb += self.decode(self.start, code, 0)
        return sb


m = MorseTree()
m.add('E', ".")
m.add('T', "_")
m.add('I', "..")
m.add('A', "._")
m.add('N', "_.")
m.add('M', "__") 
---------

Ich verstehe leider weder Angabe, noch den dazu ergänzten Code. Kann mir einer kurz erklären worum es hier geht?


Vielen Dank!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Man sollte keine Abkürzungen benutzen, wenn symbol gemeint ist, dann schreibt man nicht sym.
Variablennamen werden nach Konvention komplett kein geschrieben.
Warum nennt man den Zweig Punkt left und Strich right? Und das Zeichen value? Solche verwirrenden Bezeichnungen machen den Code schwer lesbar.
Die Funktionen add, add_symbol und decode sind so geschrieben, als würden sie rekursiv benutzt, die Implementierung ist aber iterativ.
Daher sollte man auch die Signatur der (internen) Funktionen entsprechend anpassen, bzw. ganz weglassen.
Die Methode add_symbol funktioniert nicht, wenn man nicht den Baum von oben heraus aufbaut.
Wenn man sich ausschließende if-Ketten hat, dann benutzt man für alle außer dem ersten if elif.

Also sollte der Code eher so aussehen:

Code: Alles auswählen

class MorseNode:
    def __init__(self, character=None):
        self.character = character
        self.dash = None
        self.dot = None

class MorseTree:
    def __init__(self):
        self.start = MorseNode()

    def add(self, character, morse_code):
        node = self.start
        for symbol in morse_code:
            if symbol == '.':
                if node.dot is None:
                    node.dot = MorseNode()
                node = node.dot
            elif symbol == '_':
                if node.dash is None:
                    node.dash = MorseNode()
                node = node.dash
        node.character = character

    def decode(self, morse_code):
        node = self.start
        for symbol in morse_code:
            if symbol == '.':
                node = node.dot
            elif symbol == '_':
                node = node.dash
        return node.character

    def decode_list(self, morse_codes):
        return "".join(map(self.decode, morse_codes))


morse_tree = MorseTree()
morse_tree.add('A', "._")
morse_tree.add('E', ".")
morse_tree.add('I', "..")
morse_tree.add('M', "__") 
morse_tree.add('N', "_.")
morse_tree.add('T', "_")
Zu Deiner Frage: beim Code geht es darum, Morse-Zeichen in einem Baum zu speichern und wieder abzufragen.
Antworten