Eliminación de elementos específicos de una cadena después de transformarlo en un array

Así que lo que hice a continuación es obtener un número de usuario y cambiar las letras del alfabeto como ese número específico. Por ejemplo, cuando str = "aby" y el num = 3 la salida será "deb". Funciona bien con las letras solamente. Pero habrá marcas de puntuación, espacios, etc. y si escribo "A por 3." como cadena, llego a erros como error Nomethod.( La salida debe ser: "D eb 3.") ¿Cómo puedo cambiar las letras y dejar las otras sin cambios al mismo tiempo?

Por favor, no escriba un nuevo código para esto. Sólo quiero resolver el problema de mi propio código. Gracias.

puts "Please type a number: "
num = gets.chomp.to_i  

alp = ("a".."z").to_a  

# This is the erroneous part :
str = "aby".split("")

number_conv = str.map { |a| alp.index(a) + num}

letter_conv = number_conv.map do |e|
  if e + num < 26 
    alp[e]
  else   
    e = (e + num) % 26
    alp[e - num]
  end
end

p letter_conv.join

Pregunta hecha hace 3 años, 4 meses, 25 días - Por techtrailblazer


3 Respuestas:

  • Envuelve tu código para cambiar caracteres en una función. Añadir una condición mientras se mueve a ignorar caracteres especiales.

    En el cuerpo principal, dividir su frase en el espacio blanco y pasar cada palabra a la función anterior.

    def shift mystr, num
      ignore = %w{( ) ? ,}  # put all the characters you want to ignore here.
      alp = ("a".."z").to_a
    
      str = mystr.split("")
      
      number_conv = str.map { |a| ignore.include?(a) ? a : alp.index(a) + num}
    
      letter_conv = number_conv.map do |e|
        if ignore.include?(e)
          e
        elsif e + num < 26
          alp[e]
        else
          e = (e + num) % 26
          alp[e - num]
        end
      end
      letter_conv.join
    end
    
    puts "Please type a number: "
    num = gets.chomp.to_i
    puts "Please type a string: "
    str = gets.chomp
    puts str.split.map {|i| shift i, num}.join(" ")
    

    Respondida el Dec 21, 2020 a las 08:32 - por compilerhero1251

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se produce porque estás tratando de convertir elementos que no son letras en tu array letter_conv. Para evitar esto, puedes verificar si el elemento actual es una letra antes de realizar la conversión con el siguiente ajuste en tu código:

    ruby
    puts "Please type a number: "
    num = gets.chomp.to_i  
    
    alp = ("a".."z").to_a  
    
    

    This is the corrected part:

    str = "A por 3.".split("") number_conv = str.map do |a| index = alp.index(a.downcase) if index index + num else a end end letter_conv = number_conv.map do |e| if e.is_a?(Integer) if e < 26 alp[e] else e = (e + num) % 26 alp[e - num] end else e end end p letter_conv.join

    Con este cambio, si el elemento actual no es una letra, simplemente se mantendrá sin cambios en lugar de intentar convertirlo. De esta manera, podrás preservar los elementos que no son letras sin causar errores en tu código.

    Respondida el Dec 22, 2020 a las 08:29 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para resolver el problema con tu código, puedes utilizar el método gsub para reemplazar solo las letras del alfabeto en la cadena original, dejando inalterados los caracteres que no son letras. Aquí tienes el código modificado:

    ruby
    puts "Please type a number: "
    num = gets.chomp.to_i  
    
    alp = ("a".."z").to_a  
    
    

    Reemplazar solo las letras con el método gsub

    str = "A por 3." str = str.gsub(/[a-zA-Z]/) do |match| index = alp.index(match.downcase) if index letter_conv = if index + num < 26 alp[index + num] else (index + num) % 26 alp[(index + num) % 26] end match.downcase == match ? letter_conv : letter_conv.upcase else match end end p str

    Respondida el Dec 22, 2020 a las 08:38 - por Gemini

    Votos positivos: 0 | Votos negativos: 0