代码执行得很好,但我缺少一个规范:同一单词的字母之间的空格必须用莫尔斯的空白空格替换。例如:hi在莫尔斯码中是.... ..(4点,空格,2点)....代码不能识别我在主哈希中表示这种分离的方式——>"=比;";">
你知道我错过了什么吗?由于
我的代码如下:MASTER = { "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" => "--..",
" " => "|",
"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 encode(text)
# TODO: write a method which returns the morse sentence for the given text
# NOTE: you may want to extract a `encode_word` method
encode_word = ""
text.chars.each { |element| encode_word << element.gsub(/(w|W)/, MASTER) }
encode_word
end
设master
为题中给出的哈希值
假设
text = "Little Miss Muffet"
我们可以这样修改text
。
text.gsub(/.(?=(.))?/) do |c|
MASTER[c] + ((c != ' ' && $1 && $1 != ' ') ? ' ' : '')
end
#=> ".-.. .. - - .-.. .|-- .. ... ...|-- ..- ..-. ..-. . -"
看到字符串# gsub。
正则表达式包含以下元素:
. # match any character (other than a line terminator)
(?= # begin a positive lookahead
(.) # match any character and save it to capture group 1
)? # end the positive lookahead and make it optional
如果匹配的第一个字符后面跟着另一个字符,则执行正向前看,并将后面的字符保存到捕获组1中,并由全局变量$1
保存。
如果匹配的第一个字符是字符串中的最后一个字符,则不执行正向查找。本例为$1 #=> nil
.
的表达式
c != ' ' && $1 && $1 != ' '
读取,"匹配的字符('c'
)既不是空格,也不是字符串的最后一个字符($1
),后面的字符不是空格($1 != ' '
)"
请注意,这种方法直接操作字符串,而不是将其分解成单词,将每个单词转换为字母数组,操作这些数组,然后将结果转换回字符串。
按空格(或任何空格)将文本分割成单词,使用莫尔斯电码替换表翻译这些单词中的每个字符,然后将所有内容重新连接在一起(将字符与空格连接,将单词与管道连接)。就像
def encode(text)
text.split(" ").map do |word|
word.each_char.map do |char|
MASTER[char]
end.join(" ")
end.join("|")
end
注意
- 一旦输入不包含在莫尔斯表中,这将开始失败。例如,
é
会导致错误。 - 由于大写/小写在莫尔斯码中是相同的,您可以删除一半的表,并确保使用正确的大小写进行查找。例如,放下小写字母,像这样查找
MASTER[char.upcase]
Code
首先让我们使用word.chars.map { |letter| MASTER[letter] }
从哈希中得到等价的哈希值,然后我们使用这个正则表达式/(?<=w) (?=w)/
来替换空白。
def encode(text)
text.gsub(/w+/) do |word|
word.chars.map { |letter| MASTER[letter] }.join("").gsub(/(?<=w) (?=w)/, "")
end
end
输入的例子
text = "hello world"
p encode(text)
输出"......-...-..--- .-----.-..-..-.."