2016-10-18 4 views
-1

Ich habe versucht, einen Morse-Decoder zu erstellen. Es ersetzt lateinische Buchstaben durch ihre Morse-Codes. Es gibt einen Leerraum zwischen Buchstaben und drei Leerräume zwischen Wörtern.Ruby Morse Decoder

def decodeMorse(morseCode) 
morse_dict = { 
    "a" => ".-","b" => "-...","c" => "-.-.","d" => "-..","e" => ".","f" => "..-.","g" => "--.","h" => "....","i" => "..","j" => ".---","k" => "-.-","l" => ".-..","m" => "--","n" => "-.","o" => "---","p" => ".--.","q" => "--.-","r" => ".-.","s" => "...","t" => "-","u" => "..-","v" => "...-","w" => ".--","x" => "-..-","y" => "-.--","z" => "--.."," " => " ","1" => ".----","2" => "..---","3" => "...--","4" => "....-","5" => ".....","6" => "-....","7" => "--...","8" => "---..","9" => "----.","0" => "-----" 
} 

wordList = morseCode.split(" ") 

wordList.each do |word| 
    word = word.downcase 
    word.split("").each do |letter| 
    a = ' ' + morse_dict[letter].to_s + ' ' 
    word.gsub! letter a 
    end 
end 

sentence = wordList.join(' ') 

return sentence.lstrip 

end 

puts decodeMorse("Example from description") 

Dann habe ich diesen Fehler:

NoMethodError: undefined method `letter' for main:Object 
    from codewars.rb:12:in `block (2 levels) in decodeMorse' 
    from codewars.rb:10:in `each' 
    from codewars.rb:10:in `block in decodeMorse' 
    from codewars.rb:8:in `each' 
    from codewars.rb:8:in `decodeMorse' 

Was ist falsch?

+0

'word.gsub! (Buchstabe, a)'? (nur eine Vermutung, dass die Parameter ohne die Klammern nicht richtig interpretiert werden, aber könnte falsch sein) – Tensibai

Antwort

1

Das Problem ist hier:

word.gsub! letter a 

es von rechts nach links interpretiert wird, da kein Komma zwischen letter und a ist es als letter(a) Funktionsaufruf behandelt werden wird. Sie wollen beide letter und a zu einem Funktionsaufruf ⇒ sie übergeben als Parameter trennen mit Komma:

#    ⇓ HERE 
word.gsub! letter, a 

BTW, gsub könnte einen Hash als zweite param nehmen Ersetzungen zu machen:

word.gsub(/./, morse_dict) 

würde alle Buchstaben zu ihren Morse-Darstellungen ändern. Um mit Leerzeichen umzugehen, könnte man gsub verwenden, das einen Block nimmt:

word.gsub(/./) { |l| " #{morse_dict[l]} " }.squeeze(' ') 
+0

Danke, Fehlermeldung ist verschwunden, aber ich kann nicht die Ausgabe, die ich erwarte. –

+0

Ausgabe: "Beispiel aus Beschreibung" Es gab mir meine genaue Eingabe. –

+0

Ich folgte Ihrem Code nicht, die Frage lautete "Was ist die Ursache für diesen Fehler" und ich habe sie beantwortet. – mudasobwa