Cada método en Ruby no funciona como esperaba

Tengo dos entradas y estoy tratando de imprimir la primera, pero si alguno de esos elementos en la segunda matriz es el mismo que cualquiera de los elementos de la segunda matriz, debería imprimir la palabra "ELIMINADO" en lugar de ese elemento. Pero no estoy teniendo el resultado esperado.

entrada 1 a b c d entrada 2 a c

resultado esperado REDACTED b REDACTED d pero mi resultado es esteREDACTED b REDACTED c c d d

puts "Enter some text: "
text = gets.chomp

puts "Enter words to redact: "
redact = gets.chomp

words_text = text.split(" ")
words_redact = redact.split(" ")

words_text.each do |word|
  words_redact.each do |r_word|
    if word == r_word
      print "REDACTED "
      break
    else
      print word + " "
    end
  end
end
Answer

El problema es con 2 cada uno, tiene 2 bucles y si para cada ocurrencia imprime al menos print word + " ". ¿Un mejor enfoque sería usar include? y recorrer una sola matriz.

result = words_text.map do |word|
    if words_redact.include? word
        "REDACTED"
    else
        word
    end
end

print result

Otros tienen bastante razón en que usar #include?es la mejor manera de abordar esto, pero puede iterar sobre la matriz de palabras redactadas para verificar cada palabra. Establecemos una bandera llamada should_be_redacteda false, luego iteramos sobre words_redact. Si alguna de esas palabras es igual a la palabra que estamos buscando, cambiamos should_be_redacteda true, y breakpara evitar hacer un trabajo innecesario.

Entonces simplemente tenemos que decidir qué imprimir en función del valor de should_be_redacted.

words_text.each do |word|
  should_be_redacted = false

  words_redact.each do |r_word|
    if word == r_word
      should_be_redacted = true
      break
    end
  end

  print "#{should_be_redacted ? 'REDACTED' : word} "
end

Es posible que desee comparar de forma que no se distingan entre mayúsculas y minúsculas.

words_text.each do |word|
  should_be_redacted = false

  words_redact.each do |r_word|
    if word.upcase == r_word.upcase
      should_be_redacted = true
      break
    end
  end

  print "#{should_be_redacted ? 'REDACTED' : word} "
end

Podemos simplificar el uso del #any?método para manejar el cortocircuito por nosotros y el valor booleano.

words_text.each do |word|
  should_be_redacted = 
    words_redact.any? do |r_word|
      word.upcase == r_word.upcase
    end

  print "#{should_be_redacted ? 'REDACTED' : word} "
end