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 😓
la primera parte cálculo la población en cada posición y depués a lo bruto el coste de todas las posiciones pasando como función de coste constant_crab_cost os sea el calculo de coste base (1 movimiento 1 unidad de combustible)
Aqui veis que el coste es una funcion muy tonta que acumula el coste de todas las moverse a todas posiciones desde todas las demás (multiplicando cada una de aquellas por su poblacion de cangrejos)
calcular el coste básico por posición aqui es simplemente contar el numero de posiciones entre el origen y destino
Atacamos el test y luego el puzzle...
Otra estrella para la saca aunque sea cutremente por la fuerza bruta (ya hablaremos de eso...)
Veamos la segunda parte.. En esta ocasion nos cambian la función de calculo por una que genera costes incrementales por cada movimiento de mas (que si los contenedores , que si el precio del la luz ya sabéis repercutir al consumidor...)
luego me dí cuenta que Gauss se revolvería en su tumba si me viera calcular así las sumas de una serie aritmética y no con n(n+1)/2. Esta optimización nos ahorra montones de operaciones de memoria y aritméticas...
No mucho mas que cambiar para la parte 2 (seguimos a los bruto)
Buenos pues ya está, el puzzle tarda unos segundos en ejecutarse para mi bochorno..
Otra estrella ganada a lo picateclas
Pensando después se me ocurrio que podria pasarle el costo actual como cota superior a la funcion cost_at de esta manera si excedemos la cota podemos abortar prematuramente el cálculo sabedores de que vamos a calcular en vano el resto..
Ah! por cierto si quereis aprender sobre Gauss y las series aritméticas el gran @emulenews es uno de los primeros sitios donde podeis empezar: francis.naukas.com/2010/04/15/iii…
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 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.+
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 +