Banner de perfil

Slices Y GO

Héctor Daniel Jacales Rojas@danjacales

Es muy interesante la forma en que los slice y arrays trabajan en go.

Sin duda es bueno saber esto para evitar errores al asumir comportamientos que pasan en otros lenguajes pero en go.


Resolver Un Ejercicio Para Entrevista De Trabajo En 5 minutos... Con Programación Funcional.

Héctor Daniel Jacales Rojas@danjacales

En el sitio de competencias y retos de programación CodeSignal, encontré un reto que me resulto interesante. No por su complejidad como por su naturaleza para poder explicar algunos conceptos de programación funcional.

Me gusta esta plataforma por que permite usar muchos de los lenguajes de programación más populares ( y no tan populares) . Lo que permite practicar y desempolvarse en los lenguajes que uno elige.

Para este reto, elegí Clojure, un lenguaje funcional que llevo algo de tiempo practicando y estudiando. Aunque no lo he utilizado para crear algún proyecto serio.

Me gusta por que usa una sintaxis completamente distinta a los lenguajes convencionales (Java,PHP,Ruby,Python,etc...) Y al seguir el paradigma funcional de manera estricta es necesario plantear los problemas de manera diferente a si se usara un lenguaje procedimental ( donde se indica de forma explicita lo que se tiene que hacer) . Para usar el paradigma funcional se requiere un enfoque más “matemático” . Pensar en funciones, como aquellas herramientas que damos un valor y nos regresan un resultado. Tal como en las clases de Cálculo I,II y III.

El reto básicamente consiste en lo siguiente.

Tenemos a nuestro cuidado una planta, que parte de una altura 0. (cm). Cada día crece n centímetros ( upSpeed ) y por la noche, por falta de luz decrece m centímetros ( downSpeed ) . Lo que queremos calcular es cuantos días se requieren para alcanzar una altura deseada ( desiredHeight ).

La función a desarrollar seria la siguiente.

growingPlant(upSpeed, downSpeed, desiredHeight )

Primera Parte

En este caso se necesita iterar a partir de dos variables iniciales, day y actual . Day es el día, empezamos en el día cero. Al igual que actual, que representa la altura inicial.

En este caso sabemos que debemos detenernos cuando la altura “actual” sea igual o mayor que la altura deseada. Y debemos regresar el valor de “day” que tiene el numero de días que han transcurrido desde que la planta ha crecido.

En caso contrario necesitamos hacer uso de recur. Una función especial en Clojure. Que por un lado incrementa por cada llamada a “day” en una unidades. Despues hace uso de una función “calcGrow” que lo que hace es asignar su valor de regreso a la variable “actual”. Lo que hace esta función se detalla en la segunda parte.

Segunda Parte

calcGrow recibe cuatro parametros

a => altura actual de la planta, al inicio del día.

u => cuanto crece la planta en un día

d => cuanto decrece la planta en la noche

g => cuanto esperamos que la planta crezca.

Y la función nos devuelve dos posibles resultados.

En caso de que la altura inicial mas el crecimiento del dia sea mayor o igual a la altura deseada. Se regresa la altura deseada, ya que se ha alcanzado nuestro objetivo.

En caso contrario se incrementa a el valor actual y se le resta el valor de decrecimiento de la noche.

Resultados

Como se puede observar el código ha pasado todos los casos de prueba. Lo que es una gran ayuda en herramientas como CodeSignal. Ya que suelen ser pruebas que cubren todo tipo de escenario posible. Y se va formando el habito de escribir código de calidad.


Resolver problemas complejos. Fitness Mental.

Héctor Daniel Jacales Rojas@danjacales

En ocasiones es necesario practicar un poco, sobre todo para desempolvarse después de un periodo vacacional o simplemente por que es divertido. En mi caso suelo resolver algunos ejercicios en https://codesignal.com/ o https://www.hackerrank.com .

De esos momentos, he aprendido un par de cosas que me gustaría compartir, ya que en nuestro día a día podemos llegar a encontrarnos con algún proceso o tarea que no es tan trivial resolver y requiere de un poco de algoritmia y creatividad de nuestra parte.

Este es un ejercicio que sirve de ejemplo: Dado un arreglo de n elementos, encontrar la suma mayor de sus k elementos consecutivos.

Ej. a = [2, 3, 5, 1, 6] y k = 2

2 + 3 = 5;

3 + 5 = 8;

5 + 1 = 6;

1 + 6 = 7;

La respuesta seria 8 ya que es la suma mayor.

Ahora para resolver este problema yo hago los siguiente:

1.- Empiezo por el caso mas sencillo. Por ejemplo un arreglo de longitud n y con k = 1. En este caso la respuesta se obtiene simplemente buscando el elemento mayor del arreglo. [Imagen 1] 2.- Comenzar a formular una solución general, pero aun pueda llegar a no incluir todos los casos. Para este ejercicio es ver como podemos obtener la suma de los k elementos consecutivos [Imagen 2] y tener una forma de tenerlos "a la mano" . En eso nos podemos enfocar. [Imagen 2]

3.- Es posible no considerar algunas excepciones y que el código falle para algunos casos. [ Imagen 3] . Resolver aquellos casos particulares para los que nuestra solución falla.

4.- Una vez que tenemos una solución, el siguiente paso es optimizar nuestra solución para que sea lo más rápida y eficaz (memoria) posible.

Esta forma de programar me ha ayudado a ser mas organizado, y a no frustrarme cuando encuentro algún problema que de principio encuentro difícil. Claro que siempre hay que buscar ser los mas perfectos posible y que nuestros programas den la menor lata, pero de esta forma poco a poco vamos cubriendo más casos y es mejor tener un 80% de casos cubiertos que 0%.


PROYECTO VIAJES

Héctor Daniel Jacales Rojas@danjacales

Recientemente termine la Universidad, a la par que termine dos cursos de EDTeam, por un lado Bases de Datos y Python. Ya motivado me decidí a crear un pequeño proyecto personal.

Siempre ha sido mi sueño viajar a Europa, así que para ayudarme a ahorrar. Con el salario del empleo que obtuve, muy en parte gracias a el curso de Bases . Creé https://www.floppy.app/ (el nombre es por un perro que tuve en la infancia) .

Es un pequeño administrador y agenda que ayuda a ahorrar para viajes. Espero puedan darse una vuelta por el sitio y estaría encantado de recibir feedback. De todo tipo, lo importante es aprender y hacer mejores desarrollos cada vez. Igual son bienvenidas propuestas y criticas al proyecto. Gracias comunidad.