Разбор массива для поиска отдельного слова, заглавные буквы актуальны - PullRequest
1 голос
/ 03 июня 2019

Ниже приведено упражнение, над которым я работаю.

Должен возвращать предложение, в котором каждое слово проклятия имеет свои гласные, замененные на '*' 'do

Пример # 1 Цензор ("Гоша, черт возьми", ["Гоша", "штопать", "стрелять"]) => ("Г * ш д * рн ит")

Пример # 2 цензор («ЗАКРЫТЬ ПЕРЕДНЮЮ ДВЕРЬ», [«дверь»]) => («ЗАКРЫТЬ ПЕРЕДНЮЮ Д ** R»)

Где я озадачен, так это как учесть ограничения. Первоначально я начал просматривать каждое слово, но не могу найти лучший способ использовать что-то вроде .include, чтобы проверить, было ли это слово в массиве.

Я начал со следующего

 def censor(sentence, curse)
    vowels = "aeiouAEIOU"
    result = ""
    words = sentence.split(' ')

    new_curse = curse.join(",")
    p new_curse.downcase
    p words

    words.each.with_index do ???
            if word.casecmp?()
                word.each_char do |char|
                    if vowels.include?(char)
                        result << "*"
                    else
                        result << char
                    end
                end
            else 
                 result << word 
            end

     end
    return result
end

Ответы [ 4 ]

1 голос
/ 03 июня 2019

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

def censor(sentence, coarse_words)
   sentence.gsub(/\p{L}+/) { |word|
     coarse_words.include?(word.downcase) ? word.gsub(/[aeiou]/i, '*') : word }
end

censor "Gosh darn it", ["gosh", "darn", "shoot"]
  #=> "G*sh d*rn it"
censor "SHUT THE FRONT DOOR AFTER YOUR ARE OUTDOORS", ["door"]
  #=> "SHUT THE FRONT D**R AFTER YOUR ARE OUTDOORS"

Для читателей, незнакомых с \p{L}, выполните поиск Regexp . Это то же самое, что и \p{Alpha} и [[:alpha:]], которые описаны в одном файле.

Если было отфильтровано большое количество текста, было бы эффективнее создать набор грубых слов:

require 'set'

def censor(sentence, coarse_words)
    coarse_words_set = coarse_words.to_set
    sentence.gsub(/\p{L}+/) { |word|
      coarse_words_set.include?(word.downcase) ? word.gsub(/[aeiou]/i, '*') : word }
end

Если бы, кроме того, список грубых слов был статичным, можно было бы сделать набор грубых слов константой:

require 'set'
COARSE_WORDS = ["gosh", "darn", "shoot"].to_set

def censor(sentence)
    sentence.gsub(/\p{L}+/) { |word|
      COARSE_WORDS.include?(word.downcase) ? word.gsub(/[aeiou]/i, '*') : word }
end
0 голосов
/ 03 июня 2019

Если вы используете встроенные функции ruby, это можно сделать более элегантно:

def censor(sentence, curse)
  curse_re = Regexp.new(Regexp.union(curse).source, 'i')
  sentence.split(' ').map do |word|
    curse_re.match(word) ? word.gsub(/[aeiou]/i, '*') : word
  end.join(' ')
end

Это работает для обоих ваших тестов: Попробуйте онлайн!

Флаг i заставляет гласные игнорировать регистр, а curse_re будет соответствовать любому из слов проклятия, также игнорируя регистр.

Для дальнейшего использования вы получите лучшие ответы на этот вопросна сайте SE codereview .

0 голосов
/ 03 июня 2019

Вероятно, существует множество способов сделать это, вот что интересно в кодировании.Вот один из способов, если вы хотите использовать регулярные выражения.Замена гласных нечувствительна к регистру, поэтому она решает эту проблему:

sentence = "Darn, DARN! I forgot my pizza. SHOOT, flip this!" 
bwords = %w(darn shoot flip) #cuss words to censor
censored = [] #array for the result

words = sentence.split(" ")

for word in words
word = word.gsub(/[aeiou]/i, "*") if bwords.include? word.downcase.gsub(/[^a-z0-9\s]/, '')
censored.push(word) #put censored word in new array
end

puts censored.join(' ')

Выходы:

D*rn, D*RN! I forgot my pizza. SH**T, fl*p this!

0 голосов
/ 03 июня 2019

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


def get_stared(word)
  vowels = "aeiou"
  result = ""

  word.each_char do |char|
    if vowels.include?(char.downcase)
      result += "*"
    else
      result += char
    end
  end
  result
end

def censor(sentence, curse_words)

  words = sentence.split(" ")

  new_words = words.map do |word|
    if curse_words.include?(word.downcase)
      get_stared(word)
    else
      word
    end

  end
new_words.join(" ")
end

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