Recientemente he estado conociendo el lenguaje Elixir, un lenguaje que aprovecha la máquina virtual de Erlang, una plataforma conocida por soportar sistemas en baja latencia, sistemas distribuidos y tolerantes a fallas.
Para familiarizarme con el lenguaje he optado por resolver algunos ejercicios, un par de ellos son el Fizz Buzz y Guess My Number.
Fizz Buzz
Normalmente suelo resolver este ejercicio con una iteración, y el siempre confiable y útil IF, sin embargo, Elixir al ser un lenguaje funcional obliga a la implementación de otra solución bajo términos funcionales, aquí el primer reto.
La forma natural en la pienso el cómo resolver esto es:
- Obtener una lista de números para iterar
- Evaluar cada número en los posibles casos del FizzBuzz
Primer Acercamiento con Elixir
El primer alcance que pude lograr fue el obtener una lista de números a partir de un número, el número mayor en esta lista.
La principal dificultad de esto fue el concebir la idea del tener más de una función que se llama a sí misma, y la idea de que tener casos específicos de esta función como el caso de def makeListUntil(1), do: [1]
necesario para tener un tope en las llamadas recursivas al invocar la función. En lo personal resultó complicado e interesante el hecho de ir armando una lista de esta forma.
Esto me ayudó para implementar la distinción de casos del fizz buzz, para lo cuál realice varios casos de una misma función:
Al pasar un solo número con esto podía distinguir si era un fizz, un buzz, un fizz buzz, o cero.
El siguiente pasó fue implementar la lista, de modo que al pasar un número N, obtuviera una lista desde 0 hasta N, con la implementación de fizz buzz.
Este paso resultó también el que más tiempo me llevó, probablemente debido a ser uno de mis primeros acercamientos al lenguaje.
Esta única función recibe un número, el cuál es evaluado por casos según el fizz buzz, e inicia una lista, enviando el número menos uno a la misma función. En la ejecución podemos ver que el número pasa de forma descendente por las funciones escritas.
Segundo Acercamiento
Ya con ayuda de @neodevelop, pudimos encontrar una segunda solución a este ejercicio usando más elementos del lenguaje.
Este acercamiento trataba directamente a una lista de números, a los cuales se aplicaba una función, que debería retornar una función con la solución correcta. Aquí hicimos uso de las tuplas, para llamar a una función fb_categorize
que nos regresaría un elemento con el que iríamos formando la lista con la solución.
Para ello nuestra función fb_categorize
al recibir una tupla de elementos booleanos podríamos implementarla tantas veces como combinaciones necesarias.
Finalmente para concluir nuestro ejercicio hicimos uso del pipe de elixir para primero crear una lista de número a partir de un número, y luego aplicar el fizz buzz, y hacer nuestro código más legible:
Al comprender estos elementos del lenguaje pude resolver otro ejercicio “Guess my number”, del cuál platicaré en otro post.
Gracias por leer.