如何在Ruby中将单词转换为语音字母?

时间:2018-12-20 04:57:26

标签: ruby

我正在尝试编写代码以将一个单词转换为拼音字母。期望的返回值应该是这样的:

# >> Type your name and I will convert it to Phonetic Alphabets!
Kevin
# >> Kilo Echo Victor India November

我写了一个哈希。

puts "Type your name and I will convert it to Phonetic Alphabets!"
name = gets.chomp
nato_keys =  {
    "A": "Alpha", "B": "Bravo",   "C": "Charlie",
    "D": "Delta",  "E": "Echo",    "F": "Foxtrot",
    "G": "Golf",   "H": "Hotel",   "I": "India",
    "J": "Juliett","K": "Kilo",    "L": "Lima",
    "M": "Mike",   "N": "November","O": "Oscar",
    "P": "Papa",   "Q": "Quebec",  "R": "Romeo",
    "S": "Sierra", "T": "Tango",   "U": "Uniform",
    "V": "Victor", "W": "Whiskey", "X": "X-ray",
    "Y": "Yankee", "Z": "Zulu"
  }

def nato()
    puts name.nato_keys.upcase().join(" ")
end

我的方法有问题,因为它会触发错误。

6 个答案:

答案 0 :(得分:4)

因为没有人提到它,所以这里是values_at的解决方案(假定替换键中的字符串键应该是正确的)。

str = "Kevin"
nato_keys.values_at(*str.upcase.chars).join(' ')

答案 1 :(得分:3)

假设要转换的单词数大于26,则在进行任何转换之前准备适当的哈希是合理的。

IF r_ucomm EQ '&PROC'.

 LOOP AT it_input INTO ls_input.
   PERFORM process_data USING ls_input.
 ENDLOOP.

ENDIF.

假设

H = nato_keys.transform_keys(&:to_s)
  #=> {"A"=>"Alpha", "B"=>"Bravo",..., "Z"=>"Zulu"}

word = gets.chomp

然后

word = "Kevin"

答案 2 :(得分:0)

您想这样做:

name.chars.map { |x| nato_keys[x.upcase.to_sym] }.join(' ')

name.chars给出了字符串name的每个字符的枚举,map在每个字符上进行迭代并将其转换为块中的指令。

{ |x| nato_keys[x.upcase.to_sym] },为字符选择相关的映射,但是在此之前,它将键转换为大写和符号(因为在nato_keys中,键是符号)。 “ a”将变成:A

在进行了块操作之后,我们将结果与''连接起来以得到结果字符串。

答案 3 :(得分:0)

name.upcase.chars.map(&:intern).map(&nato_keys).join(' ')

首先,我们upcase整个字符串。然后,我们将字符串分成每个单独的字符,并将每个字符变成一个符号。然后,我们可以映射一次将它们一次发送到nato_keys元素引用[]的字符,返回语音单词并转换名称。最后,用空格将它们连接起来以格式化新字符串。

编辑:使用哈希元素引用时,我们可以调用哈希本身。

答案 4 :(得分:0)

正如卡里·斯沃夫兰(Cary Swoveland)所说,确实没有意义的哈希nato_keys必须转换为有意义的哈希:

nato_keys.transform_keys!(&:to_s)

给出:

name = "Kevin"

然后

name.gsub(/(\A)?./){"#{" " unless $1}#{nato_keys[$&.upcase]}"}
# => "Kilo Echo Victor India November"

答案 5 :(得分:-1)

我将从准备更强大的哈希进行转换

开始
transform =
  nato_keys.
  flat_map do |k, v|
    v = v + ' '
    [[k.to_s, v], [k.to_s.downcase, v]]
  end.
  to_h.
  tap { |h| h.default_proc = ->(h, k) { h[k] = k } }

现在,您可以轻松地转换单词了:

"Kevin".gsub(/./, transform).strip
#⇒ "Kilo Echo Victor India November"