Serie de Desafíos con Elixir: ¿Es un palíndromo? "Ya sé Elixir Fu"

Serie de Desafíos con Elixir: ¿Es un palíndromo? "Ya sé Elixir Fu"
Neo y Morfeo después de que Neo le dijera "ya sé Kung fu" entrenando en el dojo virtual

Una de las cosas que más nervioso me pone es cuando tengo que hacer una entrevista técnica y de repente me dice el entrevistador  -Vamos a realizar un ejercicio juntos. Pensando en eso, siento que es mi deber como cuando Morfeo sintió que era su deber abrirle los ojos a Neo. Venir aquí y hacer una serie de ejercicios que ayuden a cualquier developer a estar un poco mejor preparado. Dicho eso bienvenidos a la Serie de Ejercicios de Elixir, donde exploraremos desafíos de programación tipo pregunta de entrevista. En este primer número, haremos un ejercicio muy sencillo usando los palíndromos, aquellos fascinantes textos que se leen igual de adelante hacia atrás que de atrás hacia adelante. ¿Estás listo para el desafío?

¿Qué es un Palíndromo?

Un palíndromo es una secuencia de caracteres que se lee igual de adelante hacia atrás que de atrás hacia adelante. Por ejemplo, "reconocer", "anilina" y "la ruta natural" son ejemplos de palíndromos.

El Desafío

La tarea es escribir una función en Elixir que determine si un texto dado es un palíndromo o no. La función debe devolver true si el texto es un palíndromo y false si no lo es.

“No sé si estás listo para lo que tengo que mostrarte”. - Morfeo en Matrix

Una de las cosas que me gusta de elixir es que es un lenguaje que puede ser bastante claro a la lectura. Ahora, lo primero que haremos es iniciar en la terminal el interprete de elixir eso lo hacemos con un iex en la terminal. Una vez hecho eso definamos un módulo.

defmodule Palindrome do
  @doc """
  Verifica si un texto dado es un palíndromo.

  Un palíndromo es una secuencia de caracteres que se lee igual de adelante hacia atrás que de atrás hacia adelante.
  """
end

Ahora un palíndromo como ya dijimos es un texto que se lee igual de adelante hacia atrás. Sin embargo, hay que considerar algunas cosas. Ejemplo:

  • Las mayúsculas al comparar dos strings nos van a generar un problema.
  • Los caracteres como comas, puntos rompen nuestra validación.

En conclusión necesitamos que nuestro string sea lo mas comparable posible. Necesitamos un string limpio. Estos requerimientos al ser cumplidos nos van a dar nuestro validador de palíndromos... Manos a ello.

defmodule Palindrome do
  @doc """
  Verifica si un texto dado es un palíndromo.

  Un palíndromo es una secuencia de caracteres que se lee igual de adelante hacia atrás que de atrás hacia adelante.
  """
  
  def is_valid?(text) do
  	text
    # Mayusculas?
    |> String.downcase()
    # Removamos caracteres vacios con Trim
    |> String.trim()
	# Caracteres como comas y puntos, etc...
	|> String.replace(~r/[,.#%$" "^a-záéíóúüñ]/, "")
  end
end

Una vez que nuestro string está limpio, sin caracteres raros, sin problemas entonces hay que compararlos. Compararemos el string normal con el string al revés: "Anita lava la tina" vs "anit al aval atinA".

defmodule Palindrome do
  @doc """
  Verifica si un texto dado es un palíndromo.

  Un palíndromo es una secuencia de caracteres que se lee igual de adelante hacia atrás que de atrás hacia adelante.
  """
  
  def is_valid?(text) do
  	text
    # Mayusculas?
    |> String.downcase()
    # Removamos caracteres vacios con Trim
    |> String.trim()
	# Caracteres como comas y puntos, etc...
	|> String.replace(~r/[,.#%$" "^a-záéíóúüñ]/, "")
    # Comparemos en otra función
    |> compare_strings()
  end
  
  def compare_strings(cleaned_text) do
  	# Tomamos el texto limpio y lo comparamos con el == con la cadena
    # al reves que nos retorna String.reverse()
    case cleaned_text == String.reverse(cleaned_text) do
      true -> true
      false -> false
    end
  end
end

Ejemplos de Uso

¡Vamos a probar nuestra función con algunos ejemplos! Usando la terminal corramos nuestro módulo y nuestra función. Ya solo falta nuestro texto en respuesta de "Follow the white rabbit." y ya me sentiría como en la matrix jaja.

iex> Palindrome.is_valid?("reconocer")
true

iex> Palindrome.is_valid?("anilina")
true

iex> Palindrome.is_valid?("la ruta natural")
true

iex> Palindrome.is_valid?("no es un palindromo")
false

Conclusiones

Con este ejercicio, hemos explorado cómo implementar una función en Elixir para verificar si un texto es un palíndromo. A través de la magia del paradigma funcional y la elegancia del lenguaje Elixir, hemos enfrentado este desafío de manera clara y concisa para que no temas cuando llegue el momento.

¡Espero que hayas disfrutado de este primer número de la Serie de Ejercicios de Elixir! Mantente atento para más desafíos emocionantes que te llevarán más allá de los límites de la programación funcional. ¡Hasta la próxima aventura! 🚀

Y recuerda, en Foxlabs developers si sabemos elixir Fu para esos proyectos innovadores.

Foxlabs Developers
We have built and launched our clients’ applications, guiding them from planning to production and scaling.