Palíndromos con Ruby

Los palíndromos son palabras, frases o números que leídos de atrás hacia adelante se leen igual de adelante hacia atrás; por ejemplo: arenera y ana. Para el caso de los números se les llama comúnmente capicúa; por ejemplo: 1991 y 2002. Este pequeño programa o frase nos indica si una palabra es o no es palíndromo.

print "Ingrese la palabra que desea evaluar: "
texto = gets().chomp("\n")

igual, aux = 0, texto.length - 1

0.step texto.length - 1 do |n|
  if texto[n].downcase == texto[aux].downcase
    igual += 1
  end
  aux -= 1
end

if texto.length == igual
  puts "La palabra ingresada si es palíndromo"
else
  puts "La palabra ingresada no es palíndromo"
end

Ruby es un lenguaje puramente interpretado y dinámico, además tiene una sintaxis bastante limpia, lo que facilita no solo escribir código legible sino que también de fácil mantenimiento.



gets() y chom(), solicitando y leyendo información ingresada por el usuario:
print "Ingrese la palabra que desea evaluar: "
texto = gets().chomp("\n")

Con la función print le mostramos al usuario un mensaje solicitando que ingrese una palabra. En la segunda línea leemos la palabra ingresada por el usuario usando la función gets() y usamos la función chomp() con el parámetro “\n” para eliminar el salto de línea al final de la palabra que se inserta cuando se leen strings.

Creando variables y asignando valores:
igual, aux = 0, texto.length - 1

Creamos dos variables usando asignación múltiple, esto es posible en Ruby solo si se cumple la única regla de oro, debe existir un número de valores igual al número de variables y viceversa. Ambas variables son de tipo int, pero solo la variable igual se inicializa a cero; la variable aux se inicializa con la longitud del string usando el método length y restando 1 debido a que los strings funcionan como un array de caracteres, eso quiere decir que el primer índice es 0 y el último es la longitud menos una posición para evitar errores de acceso a valores no existentes cuando recorremos los strings usando algún tipo de bucle.

Método .step, iterando para procesar la información:
0.step texto.length - 1 do |n|
  if texto[n].downcase == texto[aux].downcase
    igual += 1
  end
  aux -= 1
end

Con el método .step iteramos desde 0 hasta la longitud de la variable texto restando 1, mientras que cada número que se genera en cada iteración se almacena en la variable |n| para ser usado posteriormente. La sentencia if se encarga de evaluar si el carácter que está en el índice n de la variable texto es igual al carácter que está en el índice aux en la variable texto; si ambos caracteres son iguales, entonces la variable igual se incrementa en +1, de lo contrario, el bucle continua y solo se reduce la variable aux en –1.

El método .downcase convierte cualquier carácter del string en minúscula.

¿Es palíndromo o no es palíndromo?:
if texto.length == igual
  puts "La palabra ingresada si es palíndromo"
else
  puts "La palabra ingresada no es palíndromo"
end

La sentencia if evalúa si la longitud de la variable texto usando el método length es igual al valor contenido en la variable igual. Dependiendo del resultado de dicha verificación, nos va a informar con un mensaje usando la función puts, si la palabra es o no es palíndromo.

Ejecutando nuestra aplicación:
[fixedtorres@linuxero]$ ruby Palindromos.rb
Ingrese la palabra que desea evaluar: Arenera
La palabra ingresada si es palíndromo
[fixedtorres@linuxero]$

Es esta primera prueba nos indica que la palabra Arenera si es palíndromo.

[fixedtorres@linuxero]$ ruby Palindromos.rb
Ingrese la palabra que desea evaluar: jirafa 
La palabra ingresada no es palíndromo
[fixedtorres@linuxero]$

En esta segunda prueba nos indica que la palabra jirafa no es palíndromo.


Método .reverse, una manera corta de hacerlo todo:
print "Ingrese la palabra que desea evaluar: "
texto = gets().chomp("\n")

textrevers = texto.reverse

if textrevers.downcase.eql?(texto.downcase)
  puts "La palabra ingresada si es palíndromo"
else
  puts "La palabra ingresada no es palíndromo"
end

Con el método .reverse podemos verificar si una palabra es palíndromo de forma bastante corta, reduciendo nuestro código de 17 a 10 líneas. El método .reverse invierte el contenido del string, en la línea #4 creamos una variable y en ella almacenamos el string invertido en la variable textrevers.

En este nuevo código aparece también el método .eql?(), con él podemos evaluar si el contenido y la longitud del string en la variable texto es igual al contenido y longitud del string en la variable textrevers.

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *