Код выполняется хорошо, но мне не хватает спецификации: пробел между буквами одного и того же слова должен быть заменен пустым пробелом по Морзе. Например: привет в Морзе будет .... .. (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
Распространенная проблема с SO-вопросами заключается в том, что спрашивающие бросаются в свои проблемы с кодированием, не четко сформулировав сначала проблему, которую они пытаются решить. Читатели могут помочь только в том случае, если они хорошо понимают проблему. Вы всегда должны начинать свой вопрос с формулировки вашей проблемы словами. Затем приведите один или несколько примеров (показывая желаемый результат для каждого), если вы считаете, что это поможет читателям понять вопрос и/или проверить решения, которые они разрабатывают. Только после этого вы должны представить и обсудить код, который вы пробовали...
... Наконец, поясните, о чем вы просите читателя. Отвечайте на любые вопросы читателей по поводу проблемы, редактируя вопрос, а не уточняя его в комментариях. Вопросы должны быть автономными, отчасти потому, что не все читатели читают все комментарии.
Разделите текст пробелом (или, возможно, любым пробелом) на слова, переведите каждый символ в этих словах, используя таблицу подстановки азбуки Морзе, а затем соедините все вместе (соедините символы пробелом, слова вертикальной чертой). Что-то вроде
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 строки кода... Я чувствую, что это может быть эффективно. Любые мысли будут оценены!.
Код
Сначала давайте получим эквивалент хеша из хэша, используя 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)
Выход
"......-...-..--- .-----.-..-..-.."
Большое спасибо, Раджаголапан!!... так что нам, как используется инструмент просмотра вперед и назад!!... вы меня многому научили!
Однако один комментарий... пробел между Hello и world не заменяется на | согласно моему основному хешу... в MASTER пустое место должно быть заменено на |. --> " " => "|"
Пусть 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 пустое место должно быть заменено на |. --> " " => "|" –
Отличный вклад, Кэри!!... одна вещь, которую я заметил, это то, что запятые и одинарные кавычки не были удалены/заменены... хотя они оба находятся в хэше MASTER. Любые мысли по этому поводу? Я все равно попробую это исправить. Большое спасибо!
Я не могу воспроизвести эту проблему. Если c = ","
или c = "'"
, MASTER[c] + ((c != ' ' && $1 && $1 != ' ') ? ' ' : '') #=> " "
.
...и если text = "Little, Miss' Muffet"
, то приведенное выше выражение возвращает ".-.. .. - - .-.. . |-- .. ... ... |-- ..- ..-. ..-. . -"
.
Вы попали в ловушку, спрашивая, как конкретный подход, который вы использовали для решения проблемы (здесь регулярное выражение, которое вы построили), может быть изменен для решения вашей проблемы, а не просто спрашивая, как лучше всего решить проблему. Это настолько распространено, что ему дали название: Проблема X-Y. Если бы вы просто попросили совета о том, как решить проблему, вы бы получили более полезные и разнообразные ответы...