Замените символ трубы "|" с пробелом - PullRequest
3 голосов
/ 02 мая 2020

Я пытаюсь решить проблему с кодом Морзе, идея в том, чтобы:

  • Получить : morse_text = '.... ..|--. ..- -.-- ...'
  • Возврат : 'HI GUYS'
  • Но я получаю 'HIGUYS'

, где труба должна быть преобразована в пробел между двумя словами. Пока я получил:

def decode(morse_text)
  # TODO: Decode the morse text
  morse_text = morse_text.tr("|", " ")
  array = morse_text.split(" ").map { |word| encode_word.invert[word].upcase }
  array.join
end

def encode_word
  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" => "--..",
    " " => "|"
  }
end

Я изо всех сил пытаюсь превратить трубу в пустое пространство, чтобы я мог получить желаемый результат.

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Проблема в том, что вы конвертируете канал в пробел, что означает, что вы теряете уникальный разделитель для слов и рассматриваете его как обычный разделитель символов. Вместо этого, разделите по трубе и оперируйте массивом слов:

def decode(morse_text)
  # Split the morse code into an array of encoded words
  encoded_words = morse_text.split('|')

  # Decode each word letter by letter
  decoded_words = encoded_words.map do |word|
    word.split(' ').map { |letter| encode_word.invert[letter].upcase }
  end

  # Join each decoded word into a string
  joined_words = decoded_words.map { |word| word.join }

  # Join each word into a single string
  decoded_text = joined_words.join(' ')
end

Результат:

decode('.... ..|--. ..- -.-- ...')
=> "HI GUYS"
1 голос
/ 03 мая 2020

Просто используйте форму String # gsub , которая использует ha sh для выполнения подстановок.

Если переменная morse_code содержит ваш ha sh, с дополнительным key_value pair ""=>" ", вычислите следующее га sh.

decoding_map = morse_code.invert.transform_values(&:upcase)
  #=> {".-"=>"A", "-..."=>"B", "-.-."=>"C", "-.."=>"D", "."=>"E",
  #    ...
  #    "-..-"=>"X", "-.--"=>"Y", "--.."=>"Z", "|"=>" ", , " "=>""} 

Тогда

morse_text = '.... ..|--. ..- -.-- ...'

morse_text.gsub(/[| ]|[.-]+/, decoding_map)
  #=> "HI GUYS"

Регулярное выражение гласит: "соответствует каналу или пробелу или сочетанию одного или больше точек или дефисов ".

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