Advent of Code - Días 1 a 5

Un año más llega el 1 de Diciembre y con él el Advent of Code. Después de pasar los primeros cinco días toca hacer un poco de resumen.

Día 1: Calorie Counting

Los primeros días son los más fáciles con diferencia, sirven para coger un poco de inercia e ir entrando en la historia.

Este año la primera parte del problema tenía como principal dificultad saber parsear el fichero de entrada donde las líneas en blanco nos hacían de separador entre bloques de datos. Por cada bloque de datos simplemente había que sumar su contenido y finalmente obtener el bloque con mayor valor.

En la segunda parte, nos pedían la suma de los tres bloques con más valor por lo que si en la primera parte ya los habías ordenado simplemente había que sumar los tres primeros en lugar de únicamente el primero.

Día 2: Rock Paper Scissors

El segundo día se basó en implementar el típico juego de Piedra, Papel o Tijera pero con mucho adorno, algo muy habitual en el Advent of Code.

Este juego no es complicado de implementar, pero si es fácil de caer en la tentación de cubrir todos los posibles casos usando una cantidad enorme de ifs. En mi caso decidí hacer uso de los diccionarios para reducir enormemente el número de líneas y dejar la solución superlimpia.

La principal diferencia entre la primera parte y la segunda era que cambiaban los diccionarios basándonos en unas sencillas normas del enunciado.

También me gustaría comentar que fue el primer ejercicio en el que aplique expresiones regulares, una práctica que trato de usar lo máximo posible en este tipo de ejercicios (huyendo del .split() todo lo que pueda), ya que me sirven para mejorar mis escasos conocimientos sobre regex.

Día 3: Rucksack Reorganization

El día tres lo resumiría como un problema de conjuntos y como estos interrelacionan entre sí. Por suerte para los que usamos Python los strings son listas y como el input eran strings fue todo más fácil.

En la primera parte nos pedían dividir palabras por la mitad y buscar la letra duplicada, en la segunda parte la letra duplicada había que buscarla en bloques de tres palabras consecutivas.

Como decía al principio como los strings son listas fue tan sencillo como hacer sets a partir de esas listas y buscar sus intersecciones, para mí el problema más sencillo hasta el momento.

Día 4: Camp Cleanup

Nuevamente el día iba de conjuntos, en este caso nos daban dos rangos de números y teníamos que ver si estos estaban completamente solapados (primera parte) o si contenían al menos un elemento en común (segunda parte).

En Python es muy fácil hacer rangos con el built-in range, una vez que tenemos los rangos ya es trivial convertirlos en sets que nos permitían mirar muy fácilmente si un rango issubset del otro ó si había intersecciones entre ellos.

Este fue el segundo día que pude aplicar regex para parsear el input y cada día tengo más claro que la semántica que te da una regex es imposible que te la dé un split.

Día 5: Supply Stacks

Y llegó el primer día “complicado” y lo pongo entre comillas porque en realidad la lógica no era compleja, pero si el parseo del input, algo muy habitual en los Advent of Code.

El input se dividía en dos partes separadas por una línea en blanco. La parte superior era la representación de una pila de cajas que debíamos ordenar y la parte inferior definía una serie de instrucciones que debíamos aplicar sobre las cajas.

La resolución de la primera y de la segunda parte era idénticas salvo por un detalle. En la primera parte las cajas se apilaban de una en una y en la segunda podíamos mover varias cajas a la vez. Esto en código significaba que las cajas se apilaban en un orden o en orden invertido.

Como digo el principal problema, y donde me pasé casi todo el tiempo, fue consiguiendo traducir las cajas del input a una matriz en código. Por suerte pude apoyarme nuevamente en las regex, esta vez usando también split, lo que me permitío sacar el problema adelante.

Conclusiones

Primeros cinco días pasados y muy contento la verdad, no tengo ninguna pretensión más allá de divertirme y sé que dentro de poco no sabré solucionar los problemas (normalmente sobre el día 10) por lo que estos primeros días son los que más disfruto.

Nos vemos cuando pasen los próximos 5 días. !Un saludo!