Что такое регулярное выражение для пробела между двумя буквами одного и того же слова в Ruby

Код выполняется хорошо, но мне не хватает спецификации: пробел между буквами одного и того же слова должен быть заменен пустым пробелом по Морзе. Например: привет в Морзе будет .... .. (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

Вы попали в ловушку, спрашивая, как конкретный подход, который вы использовали для решения проблемы (здесь регулярное выражение, которое вы построили), может быть изменен для решения вашей проблемы, а не просто спрашивая, как лучше всего решить проблему. Это настолько распространено, что ему дали название: Проблема X-Y. Если бы вы просто попросили совета о том, как решить проблему, вы бы получили более полезные и разнообразные ответы...

Cary Swoveland 11.04.2023 22:53

Распространенная проблема с SO-вопросами заключается в том, что спрашивающие бросаются в свои проблемы с кодированием, не четко сформулировав сначала проблему, которую они пытаются решить. Читатели могут помочь только в том случае, если они хорошо понимают проблему. Вы всегда должны начинать свой вопрос с формулировки вашей проблемы словами. Затем приведите один или несколько примеров (показывая желаемый результат для каждого), если вы считаете, что это поможет читателям понять вопрос и/или проверить решения, которые они разрабатывают. Только после этого вы должны представить и обсудить код, который вы пробовали...

Cary Swoveland 11.04.2023 23:22

... Наконец, поясните, о чем вы просите читателя. Отвечайте на любые вопросы читателей по поводу проблемы, редактируя вопрос, а не уточняя его в комментариях. Вопросы должны быть автономными, отчасти потому, что не все читатели читают все комментарии.

Cary Swoveland 11.04.2023 23:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Разделите текст пробелом (или, возможно, любым пробелом) на слова, переведите каждый символ в этих словах, используя таблицу подстановки азбуки Морзе, а затем соедините все вместе (соедините символы пробелом, слова вертикальной чертой). Что-то вроде

def encode(text)
  text.split(" ").map do |word|
    word.each_char.map do |char|
      MASTER[char]
    end.join(" ")
  end.join("|")
end

Примечание

  • это начнет давать сбой, как только вы получите ввод, который не содержится в вашей таблице Морзе. Например. é вызовет ошибку.
  • Поскольку прописные и строчные буквы в азбуке Морзе одинаковы, вы можете отбросить половину таблицы и убедиться, что вы ищете правильный регистр. Например. отбросить нижний регистр и выполнить поиск следующим образом MASTER[char.upcase]

Большое спасибо, Паскаль, хотя ваше предложение решает общую проблему, я хотел бы знать, чего мне не хватает в предложенном мной решении. Это всего лишь 3 строки кода... Я чувствую, что это может быть эффективно. Любые мысли будут оценены!.

Panamaniac507 11.04.2023 08:26

Код

Сначала давайте получим эквивалент хеша из хэша, используя 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)

Выход

"......-...-..--- .-----.-..-..-.."

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

Panamaniac507 11.04.2023 10:02

Однако один комментарий... пробел между Hello и world не заменяется на | согласно моему основному хешу... в MASTER пустое место должно быть заменено на |. --> " " => "|"

Panamaniac507 11.04.2023 10:03
Ответ принят как подходящий

Пусть master будет хешем, указанным в вопросе.

Предполагать

text = "Little Miss Muffet"

Мы можем изменить text следующим образом.

text.gsub(/.(?=(.))?/) do |c|
  MASTER[c] + ((c != ' ' && $1 && $1 != ' ') ? ' ' : '')
end
  #=> ".-.. .. - - .-.. .|-- .. ... ...|-- ..- ..-. ..-. . -"

См. String#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 != ' ')».


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

Большое спасибо за ваш отзыв!.. Однако один комментарий... пробел между словами не заменяется на | согласно моему основному хешу... в MASTER пустое место должно быть заменено на |. --> " " => "|" –

Panamaniac507 11.04.2023 12:08

Отличный вклад, Кэри!!... одна вещь, которую я заметил, это то, что запятые и одинарные кавычки не были удалены/заменены... хотя они оба находятся в хэше MASTER. Любые мысли по этому поводу? Я все равно попробую это исправить. Большое спасибо!

Panamaniac507 12.04.2023 14:33

Я не могу воспроизвести эту проблему. Если c = "," или c = "'", MASTER[c] + ((c != ' ' && $1 && $1 != ' ') ? ' ' : '') #=> " ".

Cary Swoveland 12.04.2023 21:14

...и если text = "Little, Miss' Muffet", то приведенное выше выражение возвращает ".-.. .. - - .-.. . |-- .. ... ... |-- ..- ..-. ..-. . -".

Cary Swoveland 12.04.2023 22:18

Другие вопросы по теме