El parser!! No me canso de quitarme problemas leyendo la entrada con un poco de cuidado (incluso he tratado de correr el fichero de un puzle con el código de otro y esto ayuda a que nada que no tenga que pasar "pase"...
Leemos todos los "chunks" y de aquellos corruptos calculos su "score" an base al caracter que no cuadraba en el lexing.. Usamos un dict para las puntuaciones +
Me dá la risa porque este ejercicio se lo hemos puesto casi igual a los alumnos de "Estructuras de Datos" en el tema 1 "pilas" (la parte que pude dar esta año antes de lesionarme) Asi que voy a hacerlo un poco bonito q a alguno le puede "ilumnar". Empecemos con un poco de TDD.. +
Wrapper/worker y una pila para almacenar "aperturas" y compararlas con los cierres. si todo cuadra "bien" sino o bien falta entrada: "incompleto" o bien no cuadra con la pila: "corrupto" leed los comentarios y vereis claro el código (espero!) +
Probamos el fichero de test y el escore cuadra +
Atacamos el puzzle y aunque un tanto verboso la salida no deja lugar a dudas +
Trabajo limpio y sin problemas, aquí el TDD ha dados sus frutos y veremos luego que "tenemos gran parte de la segunda parte" avanzada.
"La parte contratante de la 1º parte..."
Con la informacion de la pila que extraeremos del parsing simplemente reconstruimos el "final perfecto" dandole la vuelta a la pila y convirtiendo aperturas en cierres. qué hemos necesitado para hacerlo? veamos.. +
Añadimos el estado de la pila y la entrada restante a las tuplas del resultado del "parsing". En realidad sólo necesitamos el estado de la pila, pues vamos a recrear el final de las cadenas invirtiendo la pila y transformando '([{<' en ')]}>' (en el función principal, claro!).. +
Probamos con el fichero de test.. +
y entonces atacamos el puzzle. Salida excelsa como siempre pero todo sin problemas.
problemas de lectura comprensiva? yo, a veces, lo que me ha llevado a darme de bruces con el puzle (habiendo pasado el test) hasta que quité las diagonales que nadie me habia pedido 🤨
El parser. aprovechamos para probar estrategias de sanitización como por ejemplo leer la primera linea y adaptar el parser al vuelo para que las demas sean exactamente de la misma longitud +
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).
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.+