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...
Evolucionar la escuela (una simple lista de peces) se vuelve cuestión de procesar cada pez y añadir los recien nacidos para el siguiente ciclo..
Con esto la parte 1 es mas bien trivial: evolucionar el cardumen de peces durante 80 días..
tanto el test como el puzzle han sido directos sin mucho esfuerzo..
Aprovecharemos la facilidad para tomar un poco el aire..
Una opcion interesante para practicar seria modelar el cardumen como una lista de 8 valores( uno por cada edad) conteniendo el nro. de peces que tienen esa edad y evolucionando el cardumen transpasando cantidades de peces de una edad a otra y añadiendo los nuevos en el valor 8..
Tal como dije la 2º parte "caza" a quellos que usen una simple, asi que he aplicado el sistema q os cuento. calculamos las poblaciones de peces para cada edad y evolucionamos las poblaciones en vez de hacerlo 1 a 1, asi a lo sumo tenemos 9 Integer para todo el cardumen de peces..
Para ello contamos los peces de cada edad que nos dan en la lista del fichero de datos...
Evolucionar las poblaciones es muy sencillo una vez que (como dije) entiendes bien el ciclo de vida del pez...
Probamos el fichero de test y luego el del puzle sin miedo a desbordar la memoria..
Otro trabajo "guarro" y que conste que quise hacerlo de una forma elegante pero acabé haciéndolo en plan "el juego de la imitación" buscando el "Heil JS!" y esperando pacientemente a que la "bomba" cuadrase todo..
Ha sido muy guarro y no me ha gustado (he usado la fuerza bruta) asi que bueno ya daré con la solución mas elegante que seguramente será una función conveza o algo similar 😓
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.+
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.. +
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 +