Bueno pues Hoy he hecho un pequeño esfuerzo por teclear y he resuelto el AoC Sonar Sweep parte 1.
Es muy facil asi que he tratado de ser un poco exótico y ahorrarme teclear mucho que apenas he podido aguantar la parte 1
Bueno agregué a un workspace las rutinas del A0C2020 por si puedo ahorrarme esfuerzo (aún ando jodido) El main funciona independiente de cuantos modulos despliegues en el directorio de challenges +
Lo primero que el puzle necesita es un swich para leer el fichero y un comando para lanzar la parte1 y la parte2 por separado. Para eso el módulo registra un subparser que se encarga de esos detalles.. +
Para leer este puzle no vamos a usar parsers combinatorios tipo #Parsy ya que es bastante fácil el formato (tal como sugería @MRonErlang en su stream del otro día) asi que no hay mucho que comentar +
El cuerpo principal de la parte 1 es bastante directo, leemos el fichero y según el subcomando elegido "part1" ó "part2" saltamos a la rutina deseada +
Es bastante sencillo y he buscado una solución que "escale" a la parte 2, en este caso un zip y la notacion de slices me permite imitar la solucion de #Haskell que pergeñé el otro día. usamos un bucle for para iterar el resultado de la cremallera directamente y contamos.. +
con el subparser creado el main nos ofrece el puzle 1 como comando y dentro de sus opciones el poder especificar part1 o part2 asi como el fichero de datos a a correr. Tambien claro podemos pasar la suite de tests (si la hubiera) +
Finalmente corremos en fichero de test y vemos que efectivamente salen 7 incrementos. Ahora probamos con nuestros datos del puzle, en mi caso salen 1583 incrementos. +
Acabo aqui por Hoy (que estoy muy cansado de teclear...) ya os enseñaré la segunda parte que es apenas añadir dos lineas a la primera... Stay tuned!
Bueno venga! que no os voy a dejar con la miel en la boca.. Hacemos un ZIP con la lista desplazada 3 posiciones y sumamos valores. Y usamos esa lista en vez del input original en nuestro bucle for para contar incrementos.. +
Y nos salen los 5 incrementos que dice el AOC +
A si que vamos ya mismo a probar con el puzle propiamente dicho y ya está. Dos estrellitas y aquí si que paro que de verdad que ya no puedo mas. 😢
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 +
ns' = tail ns, es la lista "ns" menos su primer elemto, es decir empieza por el segundo. Esto lo uso para restarle el segundo al primero con: zipWith (-) ns' ns que une en cremallera ns' y ns aplicado la resta a cada par de elementos es decir: 2º - 1º, 3º - 2º.. etc..