Arrays 通过哈希转换字符串
我想把一串摩尔斯电码转换成文字。我把绳子分成几个字。然后我将每个单词分割成字母和数字的第二个数组Arrays 通过哈希转换字符串,arrays,ruby,string,Arrays,Ruby,String,我想把一串摩尔斯电码转换成文字。我把绳子分成几个字。然后我将每个单词分割成字母和数字的第二个数组 def self.decode(str) decoded = "" arr = [] p arr = str.split(' ') p arr.map! { |i| i.split(' ') } arr.each do |r| r.each do |i| decoded += @morse.invert[i].to_s[
def self.decode(str)
decoded = ""
arr = []
p arr = str.split(' ')
p arr.map! { |i| i.split(' ') }
arr.each do |r|
r.each do |i|
decoded += @morse.invert[i].to_s[-1]
end
end
p decoded
end
在我的生活中,我使用数字。它们以N
开头。在to_s[-1]
中,-1
用于删除N
我得到这个错误:
`+': no implicit conversion of nil into String
但是我可以找出如何通过它,因为我在数组中没有看到nil
值
class Morse
@morse = {
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: '--..',
' ': ' ' ,
N1: '.----',
N2: '..---',
N3: '...--',
N4: '....-',
N5: '.....',
N6: '-....',
N7: '--...',
N8: '---..',
N9: '----.',
N0: '-----'
}
def self.encode(str)
encoded = ""
sym_temp = ""
str = str.upcase!
str.each_char do |c|
ascii_check = c.ord
if ascii_check.between?(65,90)
temp = str[c].to_sym
encoded += "#{@morse[temp]}" + " "
elsif ascii_check.between?(48,57)
temp = "N".concat(str[c]).to_sym
encoded += "#{@morse[temp]}" + " "
elsif ascii_check ===(32)
temp = str[c].to_sym
encoded += "#{@morse[temp]}"
end
end
p encoded
end
def self.decode(str)
decoded = ""
arr = []
# str.split(' ').map do |i|
p arr = str.split(' ')
p arr.map! { |i| i.split(' ') }
arr.each do |r|
r.each do |i|
p decoded += @morse.invert[i].to_s[-1].to_s
end
end
p decoded
end
# def self.read_file
# # @Temp = File.read("preamble_encode.txt").chomp
# # File.open('hiscore.txt'){|f| f.lines.map{|l| l.chomp!.split(',')}}
# # @Temp = File.foreach("preamble_encode.txt", 'r') {|f| f.lines.map{|l| l.chomp}}
# end
# def self.write_file
# # Temp2 = File.open('preamble_decode.txt', 'w') do |f|
# # f.puts Temp2
# # end
# end
end
test = "Abc 1oL!"
test2 = ".-- . - .... . .--. . --- .--. .-.. ."
Morse.encode(test)
Morse.decode(test2)
你的问题是:
:P => :'.--.',
哈希火箭右边的冒号使其成为符号,而不是字符串。碰巧,您的解码测试用例包含一个P。当您尝试查找字符串“.-”时,它找不到它并返回nil。您的问题在于:
:P => :'.--.',
哈希火箭右边的冒号使其成为符号,而不是字符串。碰巧,您的解码测试用例包含一个P。当您尝试查找字符串“.-”时,它找不到它并返回nil。
当您的问题得到回答时,我想建议您如何编写编码和解码方法
首先,散列的键应该是字符串而不是符号,因为散列用于编码由单个字符串组成的字符串。我们还需要数字是,'0'
到'9'
,而不是'N0'
到'N9'
。空格由等于七个点的时间延迟表示,而不是点和破折号的组合,因此我用字符串'
表示空格。看
因为散列不会改变,所以我将其设置为常量,而不是实例变量的值
CharactersToMorse = {
'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' => '--..' , ' ' => '<delay>', '0' => '-----', '1' => '.----',
'2' => '..---', '3' => '...--', '4' => '....-', '5' => '.....', '6' => '-....',
'7' => '--...', '8' => '---..', '9' => '----.'
}
让我们试试看
text = "NOW IS THE TIME FOR 47 RUBIESTS TO COME TO THE AID OF THEIR BOWLING TEAM"
morse = code(text)
#=> ["-.", "---", ".--", "<delay>", "..", "...", "<delay>", "-", "....",
# ".", "<delay>", "-", "..", "--", ".", "<delay>", "..-.", "---", ".-.",
# "<delay>", "....-", "--...", "<delay>", ".-.", "..-", "-...", "..",
# ".", "...", "-", "...", "<delay>", "-", "---", "<delay>", "-.-.", "---",
# "--", ".", "<delay>", "-", "---", "<delay>", "-", "....", ".", "<delay>",
# ".-", "..", "-..", "<delay>", "---", "..-.", "<delay>", "-", "....",
# ".", "..", ".-.", "<delay>", "-...", "---", ".--", ".-..", "..", "-.",
# "--.", "<delay>", "-", ".", ".-", "--"]
decode(morse)
#=> "NOW IS THE TIME FOR 47 RUBIESTS TO COME TO THE AID OF THEIR BOWLING TEAM"
既然您的问题已经得到了回答,我想建议您如何编写编码和解码方法 首先,散列的键应该是字符串而不是符号,因为散列用于编码由单个字符串组成的字符串。我们还需要数字是,
'0'
到'9'
,而不是'N0'
到'N9'
。空格由等于七个点的时间延迟表示,而不是点和破折号的组合,因此我用字符串'
表示空格。看
因为散列不会改变,所以我将其设置为常量,而不是实例变量的值
CharactersToMorse = {
'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' => '--..' , ' ' => '<delay>', '0' => '-----', '1' => '.----',
'2' => '..---', '3' => '...--', '4' => '....-', '5' => '.....', '6' => '-....',
'7' => '--...', '8' => '---..', '9' => '----.'
}
让我们试试看
text = "NOW IS THE TIME FOR 47 RUBIESTS TO COME TO THE AID OF THEIR BOWLING TEAM"
morse = code(text)
#=> ["-.", "---", ".--", "<delay>", "..", "...", "<delay>", "-", "....",
# ".", "<delay>", "-", "..", "--", ".", "<delay>", "..-.", "---", ".-.",
# "<delay>", "....-", "--...", "<delay>", ".-.", "..-", "-...", "..",
# ".", "...", "-", "...", "<delay>", "-", "---", "<delay>", "-.-.", "---",
# "--", ".", "<delay>", "-", "---", "<delay>", "-", "....", ".", "<delay>",
# ".-", "..", "-..", "<delay>", "---", "..-.", "<delay>", "-", "....",
# ".", "..", ".-.", "<delay>", "-...", "---", ".--", ".-..", "..", "-.",
# "--.", "<delay>", "-", ".", ".-", "--"]
decode(morse)
#=> "NOW IS THE TIME FOR 47 RUBIESTS TO COME TO THE AID OF THEIR BOWLING TEAM"
做一件事来快速跟踪它。更改添加逻辑如下:decoded+=@morse.invert[i]。to_s[-1]。to_sDo一件事可以快速跟踪它。更改添加逻辑如下:decoded+=@morse.invert[i]。to_s[-1]。to_sGood eyes!:)使用较新的哈希键/值表示法(在本例中为
P:'.-.
)可能可以避免这种输入错误。这个双冒号会很突出,很容易被发现。谢谢,现在我的代码也更新了一点,它似乎仍然没有把任何东西解码,但至少它没有给我那个错误!好眼睛!:)使用较新的哈希键/值表示法(在本例中为P:'.-.
)可能可以避免这种输入错误。这个双冒号会很突出,很容易被发现。谢谢,现在我的代码也更新了一点,它似乎仍然没有把任何东西解码,但至少它没有给我那个错误!这样看它让它看起来很简单,我希望我能使用字符串。。。但这是一个任务,它们必须是符号。但这真的很好看到,我会记住这一点,如果像这样的事情再次出现!如果按键是符号,这只是一个小改动。我在回答的末尾添加了一个解释。由于我认为1:或1=>不起作用,因此在如何使数字起作用方面仍然存在一些困惑?@Alex:'1'
是一个有效的符号。在散列中,可以使用{:'1'=>'·−−−−'}代码>或{'1':'·−−−−'}代码>(需要Ruby 2.2或更新版本)谢谢,@Stefan。我已经回过头来了。:-)这样看它看起来太简单了,我希望我可以使用字符串…但这是一个必须是符号的作业。但这真的很好看到,如果再次出现类似的情况,我会记住这一点!如果键是符号,这是一个小改动。我添加了一个ex在我的答案的最后是一个平面图。由于我认为1:或1=>不起作用,因此在如何使数字起作用方面仍然存在一些困惑?@Alex:'1'
是一个有效的符号。在散列中,可以使用{:'1'=>'·−−−−'}代码>或{'1':'·−−−−'}代码>(需要Ruby 2.2或更新版本)谢谢,@Stefan。我已回滚。:-)