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..
el parser como siempre para leer todo sin errores que ya bastante lío nos van a formar los amigos de Advent of Code..
Omito la 1º parte por trivial y me voy a la grandiosa idea que me iba a permitir dar la campanda. Un concienzudo análisis de las relaciones entre números y sus segmentos..
Y ha llegado a resolver el test1 pero en el segundo test 😓😓😓 No había forma..
Por mas vueltas que le daba no conseguía ver los fallos y el TDD no ayudaba mucho por que el estado que maneja era grande y díficil de modelar... Entonces se me ocurrió simplificar el asunto, generar permutaciones y aplicar las ideas de las relaciones entre números.. Funcionaría?
Bueno hubo que hacer algunas pruebas y añadir las restricciones apropiadas que capturasen las diferencias sobre todo entre códigos del mismo tamaño aprovechando que los códigos 1 7 4 8 tenian tamaños distintos y algunos como el 7 asimetrías "interesantes"
Tras añadir las restricciones básicas de tamaño y algunas interrelaciones el test 1 pasaba...
Hubo que cambiar algunas restricciones "flojas" por otras mas fuertes para pasar el segundo test..
finalmente probamos suerte con el tercero, unos 2 minutos de calculos y finalmente la bomba cuadro todos los cálculos..
En fin, no siempre se puede ser "elegante" , al menos yo 😓
Bueno no quedé muy contento con el runtime de casi 2 mins asi que repensé la generación de candidatos. sabiendo que 1,4, 7 y 8 son de longitud única restringimos las operaciones de permutacion al resto de números, manteniendo las condiciones...
así que pasamos de comprobar 3628800 pemutaciones para cada linea de display y 1 minuto y medio aprox. para resolver el puzzle completo.
a comprobar 120 pemutaciones para cada linea de display y una fracción de segundo aprox. para resolver el puzzle completo.
BTW: Si calculas los códigos de longitud 5 (2, 3, 5) y luego los de longitud 6 (0, 6, 9) son dos cálculos de 6 pemutaciones para total de 12 que una reducción del 90% frente a los 120 actuales. Ahí es nada!
• • •
Missing some Tweet in this thread? You can try to
force a refresh
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 +
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 +
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.+