Hoy no doy para mas, asi que he podido hacer la 1º parte del #AoC 3 "Binary diagnostics" pero me temo que voy a a ir perdiendo terreno con la cabeza de pelotón 😓
El parser, aqui he añadido una directiva de DoctTEST para poder chequear excepciones de Parsy +info:docs.python.org/3/library/doct…
Un parser muy sencillo claro.. +
Una vez leido calculamos cuantos códigos hay u que longitud tienen estos para crear una lista de contadores de bits, y los códigos gamma y epsilon de la longitud adecuada, fijaod en la primera parte de la función.. +
Contamos cuantos bits a "1" hay en los string de cada código. Una vez contados por cada valor del contador, si supera el 50% de los valores que hemos leido en la lista, el correspondinete bit de gamma va a "1" sino va a "0". Epsilon sigue el mismo razonamiento pero al revés. +
Finalmente hacemos un join convirtiendo los valores de gamma y epsilon (son listas) en un string y parseamos el string como un entero en base 2.
Calculamos la solución y probamos tanto el dataset de prueba como el puzzle propiamente dicho..
Easy cake. 5 estrellitas y aqui lo dejo hasta otro día...
Seguimos con la segunda parte. Primero he extraido el código de calculo de valores mayoritarios y la he ampliado con empates y un test..
Con esta funcion atacamos la busqueda del valor del oxígeno siguiendo la reglas al pie de la letra.. La busqueda recursiva y las comprensiones de listas se presta a codificar esta función de manera muy rápida y directa.
Y sí, he usado un print para sacar la traza y asegurame +
De igual manera atacamos la busqueda del CO2 teniendo en cuenta que calculamos valores mayoritarios en vez de minoritarios asi que hay que cambiar algún == por un !=
Por lo demas igual a su hermana. (las hice por separado para que se vea mas claro..)
Ya sólo queda armar el cuerpo de la segunda parte que no tienen mucho mas que rascar, buscar ambos valores , multiplicar y notificar al usuario. Si recordais el main del módulo captura todas las excepciones posibles asi que poco mas que hacer aquí..
Probamos con los datos de test y viendo que va bien atacamos el puzzle..
Bueno pues hemos terminado... Le he dado 1000 vueltas antes de escribir nada para no cansarme demasiado por algo mi motto es "solvitur ambulando"
El parser es mas bien directo ya que el formato es trivial a estas alturas "2,3,4,5,2" 🧐
el ciclo de vida del "lanterfish" es cuestion de entenderlo bien.. una vez hecho la implementacion es trivial. El pez evoluciona estados y opcionalmente tienen un vástago...
El parser de parsy se come la lista de segmentos de una tacada, aqui nada que ver salvo que quieras aprender un poco de Parsy.
Convierto los segmentos x0, y0 -> x1, y1 a (x0, y0, x1, y1)
filtramos los segmentos vert. y horiz. calculamos el grid necesario y dibujamos cada segmento en el grid (expandiendo horizontal o verticalmente en puntos (x, y) y anotando 1 en el grid por cada paso.
Finalmente contamos los solapamientos.
(código sin cometarios que me canso).
El parser, este es una bestia de parser se come el fichero entero y digiere la lista de números y todas las tarjetas de juego que se encuentre.. Que mas puedo decir, ejercito casi todo lo que tienen Parsy y como dice @FabioskySG "Hard work pays off" +
Ahora os enseñaré el cuerpo de la parte 1. Construyo instancias de la clase board y luego chequeo todos los números hasta que una de ellas devuelve "Bingo!" tras lo cual obtengo el score y ya hemos terminado. Sencillo gracias a q el trabajo esta en los métodos de la clase Board.+
El parser se asegura que leemos los comandos correctamente y que no hay nada mas. Sanitizando la entrada me ahorro muchos chequeos en otras partes.. Un par de test unitarios muy básicos y a correr
Si las lambdas fueran mas expresivas me habia ahorrado las subfunciones (quizás con una namedtuple...). por lo demás es la clasica propagación del estado en bucle +
Bueno pues Hoy he hecho un pequeño esfuerzo por teclear y he resuelto el AoC Sonar Sweep parte 1.
Es muy facil asi que he tratado de ser un poco exótico y ahorrarme teclear mucho que apenas he podido aguantar la parte 1
Bueno agregué a un workspace las rutinas del A0C2020 por si puedo ahorrarme esfuerzo (aún ando jodido) El main funciona independiente de cuantos modulos despliegues en el directorio de challenges +
Lo primero que el puzle necesita es un swich para leer el fichero y un comando para lanzar la parte1 y la parte2 por separado. Para eso el módulo registra un subparser que se encarga de esos detalles.. +
ns' = tail ns, es la lista "ns" menos su primer elemto, es decir empieza por el segundo. Esto lo uso para restarle el segundo al primero con: zipWith (-) ns' ns que une en cremallera ns' y ns aplicado la resta a cada par de elementos es decir: 2º - 1º, 3º - 2º.. etc..