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 +
Para cada coordenada calculamos si es un punto mínimo y con la lista de estos calculamos los riesgos y finalmente la solución . He combinado bucles for, maps y compresiones de listas para hacerlo mas variado +
is_low_point usa un algoritmo un poco timorato para no salirse del mapa comprobando vecinos, después calcula el menor de ellos y si nuestra celda actual es menor que este último entonces es un punto bajo. No añadáis diagonales que no hacen falta! (aunque aqui son inocuas)+
El fichero de test pasa sin problemas... +
El fichero del puzzle tambien +
Vamos con la segunda parte! +
Buscamos los "low_points" y calculamos sus "basins" o cuencas tras lo cual calculamos el tamaño de estas las ordenamos de mayor a menor y multiplicamos los 3 tamaños mas grandes para obtener la solución al puzle.
El buscador de cuencas usa una esquema worker/wrapper para buscar recursivamente los vecinos de interés a uno dado. Evita salirse del mapa con mas finura y también no evaluar los puntos identificados de nuevo.+
atacamos el fichero de test... +
atacamos el fichero del puzzle lo que nos da una salida bastante excelsa que he cortado en las parte inicial y final..
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 +
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.+