Advent of Code 2024 - Queréis problemas?

Flashk
day 8
desu

no entiendo el day 8, cual es la gracia? XD

edit: le he pedido a claude3.5 q me haga las diagonales, y tras 10 minutos lo he dejado, q cosa mas horrible jajajaja

desu

facil dia 9 tambien, al menos la parte 1

spoiler
Mandarino
day9
MartiONE

Hoy no me ha parecido fácil del todo, especialmente la parte 2

day9
desu

tengo un bug y no lo veo, suerte q mañana es mi ultimo dia, xq pereza inmensa estar mas tiempo generando casos de test a mano q no pensando los problemas. cada año igual.

ademas de 9 problemas, 3-4 se resolvian igual? que faltos de ideas

day 9

lo dejo asi, no veo el edge case, o es q he leido mal el enunciado, y parece q soy el unico tio que le ha ido el example pero no el input hoy xq no veo ni un solo tio en internet que haya escrito un puto test XD

y mira que era facil hoy

tests

edit ya lo he arreglado, media hora debugando tio jaja

1 respuesta
Mandarino

#66

parece q soy el unico tio que le ha ido el example pero no el input hoy xq no veo ni un solo tio en internet que haya escrito un puto test XD

en reddit esta lleno de posts que dicen eso xD. A mi tambien me pasó que el ejemplo me iba pero el input daba mal.

spoiler
1 respuesta
desu

#67 me la pela, me tiltean los problemas lo mal definidos que estan y que te den solo un ejemplo que no cubre ningun edge case... zZz

por ejemplo hoy, que pasa si tienes [00] o [100] es valido o que hay que hacer? el problema no te lo define... he tenido que comprobar el input y buscar si esto ocurre, y no ocurre... pero vamos, cosas asi estan los problemas llenos jaja

xq hoy mira que era facil, es un problema que habre hecho mas de 20 veces sin exagerar jaja y he estado media hora debugando zZz y el algoritmo como no estaba bien pero me estaba castiando a u8 xq el problema no definia el input y he hecho ese sin pensar

problemas que tardas 5-10 minutos a programar, de 5 a 50 minutos en entender porque estan mal explicados con la tontería de los nomos y navidad y un ejemplo q no se entiende.

nse si cada año es parecido, me parece que este año es peor que de costumbre con la tontería de hacer los problemas dificiles de resolver para las LLM, que igualment todo el top es gente resolviendolo con LLM jajaj asi que de que les sirve hacer los problemas mas cripticos?

también el problema de hoy super mal explicado lo de los espacios y "spans" y tal, xq la memoria fragmentada, si ocupas un bloque, o la desfragmentas y haces bloques nuevos, o no funciona como el problema esta explicado jaja

2 respuestas
desu

me pasaba algo curioso, el test me tardaba 4 segundos, y el release me iba en 0.06s... 60 milis si, x4000 casi, obviamente algo falla. ahora despus de comer me lo he mirado.

le he tirado un flamegraph:

el 82% en una funcion que compruéba los espacios libres en un bloque XD lo hice asi xq esto al ser continuo en memoria, y un bloque cabe en una cache line deberia volar, y vuela... cuando lo optimiza el compilador pasa a 0.06s... jaja pero en test nse que hace rust con iteradores

me lo he guardado en memoria... que es una mala practica, pero bueno, ahora la mayor parte del algoritmo es accediendo a memoria que esta bien

esta funcion era la culpable, vaya chorrada, cuando alguien os diga que la progrmaacion funcional y con streams va rapido no os fieis XD no siempre

    fn free_space(&self) -> usize {
        self.files
            .iter()
            .filter(|file| matches!(file, File::Free))
            .count()
    }

y esto solo me afecta cuando corro los tests... jaja pero me estaba rallando, xq me tardaba 4 segundos y en release tarda 60ms la parte 2 wtf

nse como arreglarlo en rust, quizas un inline o tocando algo asi se arregla, xq deberia ir volando y es mas barato hacer un bucle for que no guardarte en memoria en los bloques creo... ahi ahi, en muchos casos de uso es peor, en este como recorres con dos punteros todo el espacio se salva de que debe ser parecido el coste de la memoria vs iterar.

Mandarino

#68 yo diria que siempre ha sido asi. Hay varios problemas cada año que incluso analizando los datos del input te ayuda a descartar complejidad del problema y poder solucionarlo mas facil.
La descripcion del problema de hoy yo creo que estaba bien sin ambigüedades. Los casos de [00] o [100] no veo que cambien nada, un bloque de tamaño 0 es como si no existiera osea que se puede ignorar directamente.. incluso si lo mueves, el checksum no va a cambiar.
Tambien recuerdo problemas del año pasado bastante mas dificiles de entender al leer el enunciado, todavia no hemos llegado a ese tipo de problema este año.
Incluso este año por ejemplo el Dia5, diria que en ninguna parte del enunciado menciona si hay o no ciclos en las reglas, o si tienes que inferir reglas nuevas usando transitividad.. era un caso que tienes que mirar los datos y descubrirlo por ti mismo. En ese dia coincide que si no te das cuenta de eso da igual, pero hoy eso ya ha cambiado.

Aun recuerdo el año pasado un problema que hacerlo programando era dificil, pero si usabas una libreria que te pintase el grafo lo resolvias "a mano" mirandolo con los ojos xD

Flashk

#68 bueno, es que son puzzles, no especificaciones de un producto real a implementar... xD

Es precisamente en esas ambigüedades y datos no explicados del todo donde está la diversión (o la frustración). Cuando te das cuenta de la trampa piensas "ajá! me la querían meter doblada pero me he dado cuenta!" y te sientes satisfecho contigo mismo, mientras que cuando no lo ves es como "joder, mierda, tendría que haberme dado cuenta!".

Yo he caído como muchos otros hoy en:

la trampa
day 9
desu

ya bueno, tratamos de apretar, part2: ./target/release/aoc24 0.01s user 0.01s system 87% cpu 0.015 total ya estoy en 15ms

este tio lo ha hecho https://github.com/maneatingape/advent-of-code-rust/blob/main/src/year2024/day09.rs en Benchmark 187 µs. hahaha wtf

https://github.com/maneatingape/advent-of-code-rust

este tio es bueno eh

Mandarino

yo luego voy a intentar optimizar tambien un poco la parte2, a ver que sale

Mandarino

Un poco de limpieza y optimzado parte 2:

spoiler
codigo part2 dia 9
desu
10

hoy finito en 20 min, bueno, not bad. no recuerdo una part2 mas facil que la part1 XD

code
Mandarino
day10
1 respuesta
Flashk

#76

day 10
desu

dia11: part2 toca pensar o toca dejarlo correr media hora XD

spoiler

codigo:

spoiler

14ms, lo dejo aqui, podria hacerlo mejor precalculando paths pero no me apetece

Flashk
day 11
day 11 solución
Mandarino
day11
1 respuesta
Flashk

#80

day 11 comment
desu

Pues me he hecho un template y me he puesto ha resolver los de 2015... el año que viene me los voy a hacer todos, asi estudio leetcode con estos ejercicios... que mas da.

Lo de hacerte el template es un buen ejercicio, he tratado de hacerlo con macros... pero no he encontrado una manera de hacerlo guay. Si o si, tenia que hacer un match o generar todos los años posibles... No he sabido convertir strings o ints a "TOKENS" de rust en el AST. Seguro que se puede, pero no me ha parecido facil.

Lo que queria era poder tener una función generica y llamar:

fun run_problem(year: String, day: String) -> fun {
   lambda {
     use my_proyecto::year::day;
     input = read_from_path("inputs/$year/$day-input.txt")
     part_1(input)
     part_2(input)
  } 
}

he conseguido leer y llamar funciones, pero no he sido capaz de realizar el import "use ....".

1 respuesta
Flashk

#82 Imagino que quieres la template en el IDE para según vayas generando el código, así que no sé si esto te valdrá, pero por si quieres reutilizar la idea:

Yo lo que hice fue crearme un template repository en github, y dejar preparadas todas las clases de test para cada día. Lo único que necesito parametrizar es el año, para ello:

  • Puse en los ficheros necesarios placeholders para indicar donde van los años.
  • Cree un github action con un prompt que me pregunta que año quiero poner.
  • Tras introducirlo, mi action realiza las sustituciones de los placeholders y abre una PR, que tras aprobarla, deja todo el repositorio seteado para el año que le haya indicado.
1 respuesta
desu

#83 yo tengo:

1-crear los archivos del dia para codigo, test e input
2-exportar el dia y dia_test
3-poner el dia en el main (para benchmarks, hacer build release y resultados finales)

XD he visto gente que tiene cli o builds como con gradle, para bajarse todo e inicializar unos stubs.

Mandarino

yo tengo un archivo guarro "utils.py" que voy metiendo todo lo que quiero reutilizar (principalmente todos los imports).
Luego tengo un template.py con 3 partes:

  • parsing del input
  • solucionar problema
  • ejecutar parse+solve para X inputs hardcodeados en el mismo fichero o en otro aparte (11.txt)

Luego un script generate.py que copia el template.py 25 veces con nombre 1.py 2.py ... y crea un 1.txt 2.txt etc vacios. Tambien actualiza parte del template para que lea del archivo X.txt que toque

desu

Otra cosa interesante que he mirado, es que pueda ejecutar todo de manera granular y facilmente:

cargo run 2024 06
cargo test 2024
cargo test 2024::06
cargo test 2024::day06_test::part1
cargo test 2024::day06_test::part2
hyperfine --warmup 3 'target/release/aoc 2024 06'
cargo flamegraph --profile test --output flamegraph.svg
cargo flamegraph --profile release --output flamegraph.svg

Y se ejcuta lo que quiero, los tests, benchs y tal.

Lo malo es que tengo que copiar muchas cosas a mano, pero bueno, le he dedicado hora y media o asi... no me ha quedado mal el template.

Mandarino
day12
desu

abro dia 10, copy paste, resuelvo dia 12
me vuelvo a dormir
zZz

desu

Estoy aprovechando hoy para crear una libreria de Grid/Positions/Vectors, luego os la comparto, mi objetivo es aprovechar los optionals al maximo. Tener un codigo parecido al que os he compartido, en que un None es una posición invalida / fuera de grid.

Tambien pensaba hacer algo asi:

grid.position * top
grid.position * left

y que sea un operator overload para el get... a ver que tal, experimentare un poco.

Flashk

Ayer se me atascó la parte 2. Creo que porque partí de un principio matemático que no es correcto para buscar la solución. De alguna manera, con el algoritmo todo shitty que hice, conseguí sacar en los tests casos ok para mogollón de casos diferentes que encontré en reddit, pero había dos casos de ejemplo para los que no me tira bien. Luego ajusté el algoritmo y me pasó a la inversa: en al menos uno de esos casos que antes me petaba, ahora me funcionaba XDD Total, que voy a tirar a la basura ese algoritmo y probaré con alguna otra idea (si se me ocurre).

Hoy ha sido más ligero el tema.

1 respuesta