Как мне преобразовать слово в фонетический алфавит в Ruby? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь написать код для преобразования слова в фонетический алфавит.Желаемое возвращаемое значение должно быть примерно таким:

# >> 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 голосов
/ 20 декабря 2018

Поскольку никто не упомянул об этом, вот решение с values_at (предполагается, что строковые ключи в хэше подстановок, как и должно быть).

str = "Kevin"
nato_keys.values_at(*str.upcase.chars).join(' ')
0 голосов
/ 20 декабря 2018

Я бы начал с подготовки более надежного хеша для преобразования

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"
0 голосов
/ 20 декабря 2018

Как говорит Кэри Свовеланд, хэш nato_keys, который на самом деле не имеет смысла, должен быть преобразован в тот, который имеет смысл:

nato_keys.transform_keys!(&:to_s)

Дано:

name = "Kevin"

тогда

name.gsub(/(\A)?./){"#{" " unless $1}#{nato_keys[$&.upcase]}"}
# => "Kilo Echo Victor India November"
0 голосов
/ 20 декабря 2018

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

Сначала мы upcase всю строку.Затем мы разбиваем строку на каждый отдельный символ и превращаем каждый в символ.Затем мы можем сопоставить символы, посылая их по одному на nato_keys ссылку на элемент [], возвращая фонетическое слово и преобразовывая имя.Наконец, объедините их с пробелами для форматирования новой строки.

РЕДАКТИРОВАТЬ: При использовании ссылок на элементы Hash мы можем вызвать сам Hash.

0 голосов
/ 20 декабря 2018

Предполагая, что число преобразованных слов превышает 26, имеет смысл подготовить соответствующий хэш перед выполнением любых преобразований.

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

word = gets.chomp

Supose

word = "Kevin"

Затем

word.upcase.each_char.map { |c| H[c] }.join(' ')
  #=> "Kilo Echo Victor India November"
0 голосов
/ 20 декабря 2018

Вы хотели бы сделать это:

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

Это name.chars дает перечисление с каждым символом строки name, map перебирает каждый символ и преобразует его в инструкцию вblock.

block { |x| nato_keys[x.upcase.to_sym] }, выбирает соответствующее отображение для символа, но перед этим он преобразует ключ в верхний регистр и символ (потому что в вашем nato_keys ключи являются символами).«а» станет :A.

После манипуляции с блоком мы объединяем результат с '', чтобы получить результирующую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...