2013-05-29 4 views
1

Вопрос связан с Morse code:Почему мои методы Ruby возвращают одно и то же?

# Build a function, `morse_encode(str)` that takes in a string (no 
# numbers or punctuation) and outputs the morse code for it. See 
# http://en.wikipedia.org/wiki/Morse_code. Put two spaces between 
# words and one space between letters. 
# 
# You'll have to type in morse code: I'd use a hash to map letters to 
# codes. Don't worry about numbers. 
# 
# I wrote a helper method `morse_encode_word(word)` that handled a 
# single word. 
# 
# Difficulty: 2/5 

describe "#morse_encode" do 
    it "should do a simple letter" do 
    morse_encode("q").should == "--.-" 
    end 

    it "should handle a small word" do 
    morse_encode("cat").should == "-.-. .- -" 
    end 

    it "should handle a phrase" do 
    morse_encode("cat in hat").should == "-.-. .- - .. -. .... .- -" 
    end 
end 

Мое решение

MORSE_CODE = { 
    "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" => "--.." 
} 

def morse_encode(str) 
    arrayer = str.split(" ") 
    combiner = arrayer.map {|word| morse_encode_word(word) } 
    combiner.join(" ") 
end 

def morse_encode_word(word) 
    letters = word.split("") 

    array = letters.map {|x| MORSE_CODE[x]} 

    array.join(" ") 
end 

morse_encode("cat in hat") 
morse_encode_word("cat in hat") 

Почему morse_encode и morse_encode_word возвращение точно такой же вывод?

То, как я его создал, я бы подумал, что будут различия в расстоянии.

ответ

6

Когда вы передаете фразу в morse_encode_word, он разбивает ее буквами (то есть 't i' становится ['t', ' ', 'i']. Далее необходимо сопоставить этот массив ['-', nil, '..'] (потому что MORSE_CODE[' '] == nil).

А потом присоединиться к нему с пространством, '-' + ' ' + '' + ' ' + '..' (потому что nil.to_s == ''). Таким образом, вы получите строку с двумя пробелами внутри, '- ..'.

+0

Как вы думаете, это лучший способ, чтобы исправить мое решение, так что есть только 1 пространство между словами для morse_encode_word? потому что основная функция должна быть morse_encode, я не хочу, чтобы morse_encode_word работал на нее тоже. – JaTo

+0

@JamieS какой точный результат вы ищете? скажите, тогда мы могли бы дать лучшее решение. –

+0

Я хочу, чтобы между словами и 1 пробелом между буквами для morse_encode было 2 пробела. morse_encode_word должно быть другим и не должно содержать полную строку правильно, я хочу, чтобы у него было просто пробел между каждой буквой. Я не могу придумать способ сделать это, кроме добавления функции удаления или следующей функции для параметров morse_encode_word (для удаления пробелов). – JaTo

2

Когда вы morse_encode_word вы не избавившись от пространств ... Так будет разделить ваши слова, но сохранить пространство.

В morse_encode вы избавляетесь от пространства (из-за раскола), но добавляете его обратно, когда выполняете соединение. Таким образом, он заканчивается тем же, что и morse_encode_word.

Я бы предположил, что вы не хотите лишних пробелов в morse_encode_word. Просто сделайте чек, чтобы убедиться, что x не является пространством, прежде чем вы наберете его в файле morse_encode_word.

Попробуйте использовать отклонять:

def morse_encode_word(word) 
    letters = word.split("") 

    array = letters.reject{|x| x == " "}.map{|x| MORSE_CODE[x]} 

    array.join(" ") 
end 
+0

. Я хочу, чтобы там должно быть 2 пробела между словами и 1 пробелом между буквами для morse_encode. morse_encode_word должно быть другим и не должно содержать полную строку правильно, я хочу, чтобы у него было просто пробел между каждой буквой. Я не могу придумать способ сделать это, кроме добавления функции удаления или следующей функции для параметров morse_encode_word (для удаления пробелов). Есть ли другой способ сделать это без удаления или последующего? – JaTo

Смежные вопросы