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!