Ruby

Comprobar si una cadena es anagrama de otra en Ruby

Un anagrama es una frase o palabra cuyas letras, al acomodarse de otra manera, forman otra palabra válida. Eso sí, ninguna letra debe faltar o sobrar.

Saber si es Anagrama con Ruby

Por mencionar un ejemplo de anagrama es la palabra Enfriamiento, que es anagrama de Refinamiento; ya que ambas tienen las mismas palabras y al ordenarlas de distinta manera se forma otra.

Pues bien, hoy veremos cómo comprobar si una palabra es anagrama de otra en Ruby. Esto funcionará tanto como cadenas que representen palabras hasta con cadenas que representen oraciones largas.

El algoritmo

Hay que eliminar los signos de puntuación y espacios de la cadena, además de convertirla a minúscula (bueno, ambas deben estar en mayúsculas o en minúsculas, no mezcladas) y más tarde, ordenarla alfabéticamente (primero la a, luego la b y así).

Por ejemplo, al aplicar todo ello a la cadena Enfriamiento se obtiene aeefiimnnort. Después se hace lo mismo con la segunda palabra, y si al ordenarlas son iguales, entonces son anagramas. Ya que Refinamiento, al hacerle lo mismo, se convierte en aeefiimnnort.

Si no me crees, mira esto:

Proceso para comprobar si es anagrama en Ruby

El código lo explicaré más abajo, lo que quiero que se vea es que ambas cadenas son lo mismo.

Saber si es anagrama con Ruby

Aquí está el código fuente junto con algunas cosas para probarlo:

=begin
 Función que comprueba si una palabra es anagrama de otra,
 sin importar espacios, mayúsculas, minúsculas puntos ni comas

 @author parzibyte
=end

def anagrama(palabra, palabra2)
 # Eliminar espacios, comas y puntos. Convertir a minúsculas
 # Luego, ordenar los caracteres y unirlos de nuevo a una cadena
 # Finalmente se comparan y se regresa el resultado de la comparación (true o false)
 palabra.delete(" " "," ".").downcase.chars.sort.join ===
 palabra2.delete(" " "," ".").downcase.chars.sort.join
end

#Probar función... Algunos ejemplos fueron obtenidos de https://www.ejemplos.co/50-ejemplos-de-anagramas/
palabras = [
 ["Quieren", "Enrique"],
 ["Poder", "Pedro"],
 ["Luis", "Luis"],
 ["Otra", "Cosa"],
 ["Enfriamiento", "Refinamiento"],
 ["Tom Marvolo Riddle", "I Am Lord Voldemort"],
 ["Esto no", "Es un anagrama"],
 ["123", "321"],
 ["Visita", "parzibyte.me"]
 ]
palabras.each{|grupo|
 puts "¿'#{grupo[0]}' es anagrama de '#{grupo[1]}'? #{anagrama(grupo[0], grupo[1])}"
}

# O hacer que el usuario pruebe por sí mismo
puts "Escribe una palabra"
palabra = gets.chomp
puts "Escribe otra palabra y te diré si es anagrama de la anterior"
palabra2 = gets.chomp
if anagrama(palabra, palabra2)
 puts "Sí es anagrama"
else
 puts "No es anagrama"
end

La función es simple, recibe dos cadenas y devuelve un booleano. El proceso que sigue es:

  1. Eliminar espacios, comas y puntos con delete
  2. Convertir a minúscula con downcase
  3. Obtener sus caracteres con chars
  4. Ordenar el arreglo de caracteres con sort
  5. Una vez ordenados los caracteres, se convierten en cadena con join (se unen)

Se hace lo mismo para ambas cadenas y se devuelve el resultado de la comparación.

Descargar ejemplo

Eres libre de descargar el código fuente. Recuerda primero instalar Ruby, más tarde abre la terminal, navega hasta donde tengas el archivo y ejecuta:

ruby main.rb

O como sea que hayas llamado a tu archivo.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.