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.+
Si amigos hoy hemos hecho un poco de POO, mi pequeña y cutre clase Board me ha resuelto el trabajo, no espereis grandes maravillas de diseño orientado a objetos no obstante... +
Veamos el constructor, guardamos los numeros, ponemos el estado a no ganador e incializamos las marcas y las estadísticas a cero. +
Check comprueba si el número esta en la tarjeta, marca la posición y actualiza las estadisticas de fila, columna lo que nos permite saber si ya tenemos Bingo! o no. Actualiza el estado de la tarjeta y devuelve el resultado como True ó False.
__bool__: me he permitido sobrecargar este método para que la instancia valga True ó False dependiendo de si tenemos Bingo para cantar o no... Realemnte no me hizo falta +
__str__: Otro método mágico con un pequeño y cutre snippet para imprimir el contenido de la tarjeta +
score: con este método sacamos los valores no marcados y los sumamos multiplicando el resultado por el ultimo valor chequeado que es el que resulto en Bingo! +
Veamos si este intemerato enfoque sin TDD ni nada nos ha llevado al desastre o qué. Pasamos los datos del test sin mucho apuro... +
Bueno por probar suerte no va a pasar nada, ¿no? Asi que allá vamos.. Hay muchas tarjetas en este fichero asi que la salida es demasiado verbosa y la he cortado en su incio y final que es lo que interesa. Funcionó? +
Bueno pues me puse hace un rato con la segunda parte, simplemente seguir probando números en las tarjetas que no han ganado y memorizar cual fué la ultima en ganar asi que solo había que tocar 3 lineas de código..
Probamos con el fichero de test y vemos que muestra los resultados esperados.. +
Probamos con el puzzle completo... Son 100 número y eventualmente muchas tarjetas obtienen Bingo! pero finalmente agotamos los números... +
8 estrellas!! habrá ya @santimntl avanzado otro poco? Pues no lo dejes que "el manco" te sigue a la zaga 🤣🤣🤣
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 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).
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 +