2013-05-29 47 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

我希望在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

我想那里对于morse_encode,在单词和字母之间有2个空格。 morse_encode_word应该是不同的,并且不能正确地完成一个完整的字符串,我希望它在每个字母之间只有一个空格。除了为morse_encode_word的参数添加删除或下一个函数(删除空格)之外,我不能想到这样做的方法。有没有删除或nexting这样做的另一种方式? – JaTo

相关问题