2016-10-18 332 views
-1

我試圖創建一個莫爾斯解碼器。它用他們的莫爾斯電碼代替拉丁字母。字母之間有一個空格,單詞之間有三個空格。紅寶石莫爾斯解碼器

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") 

然後我得到這個錯誤:

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' 

有什麼不對?

+0

'word.gsub!(letter,a)'? (只是猜測參數沒有正確解釋沒有括號,但可能是錯誤的) – Tensibai

回答

1

的問題是在這裏:

word.gsub! letter a 

它正在從右邊解釋到左邊,因爲沒有逗號lettera之間它被視爲letter(a)函數調用。你想同時lettera被作爲參數傳遞給函數調用⇒將它們分開用逗號

#    ⇓ HERE 
word.gsub! letter, a 

BTW,gsub可能採取的哈希作爲第二參數去做出換人:

word.gsub(/./, morse_dict) 

會將所有字母更改爲其莫爾斯表示。要處理空間,可能需要使用gsub,它需要一個塊:

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

謝謝,錯誤消息消失了,但我無法得到我期望的輸出。 –

+0

輸出:「來自說明的示例」它給了我確切的輸入。 –

+0

我沒有按照你的代碼,問題是「這個錯誤的原因是什麼」,我已經回答了。 – mudasobwa