Advent of Code 2024 - Queréis problemas?

desu

un clásico el 4, el que más ganas tengo de hacer y tengo la mañana liada :-(

day

mi solucion de hoy de nuevo full data oriented design, tratando de practicar y exprimir la cpu, ademas me ha salido paralelizable asique contento. me la pela la eficiencia cuando resuelvo decenas de millones de elementos en la sopa de letras en <1s

1 respuesta
Cerealfriend

#29 El day3 al final... la parte1 sencilla con el regex(la deje acabada ayer por la noche) capturas los values y haces la mul...
La parte2 me estaba trabando bastante..., quise hacer parecido al dia 2 con un tolerate, si encuentro un dont no multiplico y si encuentro un do habilito, esto lo hago quedanome con la pos de cada dont y do, luego le paso la posicion de la funcion donde esta la multiplicacion, si la multiplicacion esta en una pos anterior al primer dont, devuevlo un true (hago multiplicacion) (ex: mul esta pos 4 y el 1er dont 10, al estar antes, habilitamos)

Para los demas casos, vamos calculando la posicion relativa y retornamos un boolean dependiendo la condicion inicial:

` we do mul if: 
do -> mul -> dont ---------> return lastDo(40) > lastDont(10) && mulpost(50) > lastDo(40)
`
Day3 part1 y part2

Hoy por la noche espero tener el day4 que ya se me hace bola :sad:

1 respuesta
desu

#32 te ayudo, pon la regex aqui: https://regex101.com

day3 go
1
Flashk
day 4
Pizzelio

Tremendísima liada he hecho hoy, entendí mal el enunciado pensando que la palabra podía ir cambiando de dirección y tardé muchísimo en darme cuenta. Después estaba tan harto que directamente puse mil "ifs" y pista.

Único truco sucio que me ayudó un poco

spoiler
1 respuesta
Mandarino

#35 otro truco (que se me olvidó hacer esta vez) es usar diccionarios (o map keyvalue, como le quieras decir) y usar como key la coordenada (x,y) y rellenarlo solo con lo que existe. Luego haces get con default '.' o lo que sea y gg ez

1 respuesta
Pizzelio

#36 jajaja pues también, ese no lo hice nunca

desu

dia 5: hoy fuerza bruta creo, no veo la manera eficiente.

spoiler
spoiler
Pizzelio

Entretenido el de hoy, cero eficiencia para variar. Tremendo "skill issue" detectado...

spoiler
1
Flashk

El de hoy me ha parecido divertido.

day 5

Algunos aprendizajes que he sacado del puzzle de hoy:

day 5 learnings
1
Cerealfriend

Voy tarde, day4, este problema me recuerda al del año pasado de las tuercas y nose que mas, sobre el day 5,6 recuerdo.

Me ha flipado la forma de hacerse primero un mapa de todas las posiciones #31, no conocia esa estrategia, osea es como cuando haces una bytetable royo

0x0001 -> 'red'
0x0002 -> 'blue'
0x0003 -> 'green'
...

es como que precargas las posibles posibilidades de todas las variantes?? (he tenido q consultar gpt) y directamente vas a piñon y sacas al toqe todas las posibles palabras de 4 letras (3 letras, contando que entramos al bucle cuando encontramos una "X") he querido hacerlo d esta forma copiandote, por ahora solo tengo la parte 1, quiero acabar la parte 2 esta tarde cuando acabe de trabajar y ver/hacer el day5...

part1, coming part2
MartiONE

Empiezo tarde como todos los años, dia 5 hecho :D

Mandarino
day5
codigo day5
1
Mandarino
day6
codigo day6
1 respuesta
desu

Hoy se me ocurren un par de ideas de data oriented design tambien para practicar. Luego os comparto mis notas.

spoiler
pt 2 day6
1 1 respuesta
Pizzelio

#44 Puedes explicar más la forma óptima de la parte 2? No acabo de verlo jaja

Y para la parte2 por fuerza bruta, cómo habéis comprobado si sale o no del loop?

Yo lo he hecho por fuerza bruta pero me tarda la de dios en procesar, vamos que me fui a hacer un café mientras calculaba xD

1 respuesta
desu

a mi en rust me tardaba: cargo test 3.37s user 0.03s system 100% cpu 3.391 total jajajaj

por la tarde lo quiero tocar un poco, xq al final hice lo de copiarme los arrays que queria evitar... porque simplificaba mucho la logica y tenia un bug

edit: ya simplificado

running 1 test
test day6::tests::test_part_2 ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 31 filtered out; finished in 0.89s

cargo test test_part_2  0.94s user 0.02s system 99% cpu 0.971 total

un thread por loop:

running 1 test
test day6::tests::test_part_2 ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 31 filtered out; finished in 0.43s

cargo test test_part_2  2.02s user 0.50s system 508% cpu 0.496 total
spoiler

si quereis probar esta estrategia, este es el esqueleto, estoy bastante contento

como curiosidad NI UNA SOLA VEZ COMPRUEBO SI ESTOY EN LOS BOUNDS, i < 0, i > limite... y lo mismo para las j, igual que el otro dia.

comprobar si estas en rango es un smell algoritmico.

edit: en release me tarda 200ms

Flashk

#45

day 6 un comentario sobre tu idea
day 6 solución

Me he dado cuenta que siempre que hago puzzles en los que tengo que detectar algún bucle, me bloqueo un poco pensando como debería modelar el estado detectar ciclos/bucles. El año pasado me pasó también con otro puzzle, y el anterior con el del tetris. ¿Hay algún patrón o alguna lectura que recomendéis sobre esta temática?

2 respuestas
desu

#48 el patron es, lo mas generico posible, tienes una stack, vas iterando mientras tengas elementos, si encuentras un elemento repetido/bucle/condicion saltas, si no sigues iterando la stack, añadiendo elementos si hace falta.

por ejemplo si buscas un bucle en una linkedIn list, while node != nil next node, si buscas un bucle en una posición como este ejercicio while position != nil next position y asi en grafos, listas cualquier estructura. cuando no entres en el bucle sabes que has terminado, dentro miras la condicion que toque.

si por ejemplo buscas el camino mas corto en un grafo, ahi te interesa evitar el bucle, te guardas los visitados para evitarlos y los skippeas. si necesitas hacer backtracking de algun tipo, añades elementos a la stack y ya los iteraras después.

position = initial()
while position != null:
  next_position = move()
  if condition:
     return XXX
  else:
    position = next.position

o si tienes algo con backtrack:

stack = initial()
while current = stack.pop(); next != null:
  if condition(current):
     return XXX
  else:
    stack.push(current.left)
    stack.push(current.right)

si es recursivo y no queires dar bucles:

stack = initial()
visited = []
while current = stack.pop(); next != null:
   visited.push(current)
   if condition(current):
       return XXX
  else:
    if current.left not visited:
        stack.push(current.left)
    if current.right not visited:
        stack.push(current.right)

luego algoritmos mas difciles como tener heaps o weighted grafs, consistiria en añadir informacion en la stack y visited para guardarte cosas como los pasos que has dado hasta llegar ahi, el camino que has recorrido...

1 1 respuesta
Mandarino

#46 no es la forma mas optima posible, pero mas optima de la que hice sí.

spoiler

cómo habéis comprobado si sale o no del loop?

spoiler

#48 para encontrar bucles en los casos que comentas tienes que pensar en "estados" y mirar si se repiten, marcandolos como visitados.
En el de hoy por ejemplo el estado era la posicion actual y la dirección.
En tetris es las ultimas X lineas (concatenas un string y haced un hash, modo facil) y las piezas siguientes que van a caer. Lo que no recuerdo bien era como llegaban las piezas , si se iban rotando en patrón o como iba.

1 1 respuesta
Flashk

#49 #50 no, si la idea de usar una estructura para guardar los estados la tengo clara. Lo que ocurre es que me suele costar algo determinar que guardar en los
estados deberían guardarse, y en que momento hacerlo... en este caso era fácil, pero casi que me entraron recuerdos del tetris y pensé "oh dios, otra vez no...".

cómo habéis comprobado si sale o no del loop?

Mandarino

Por mi parte:

26
Mandarino
dia 7
codigo day7
Flashk
day 7
desu

dia 7, backtracking o backtracking con pruning... nse que hacer pimero, la rapida o la optima... estoy seguro que decida lo que decida al terminar me arrepentire

dia 7
2 respuestas
Mandarino

#54

spoiler
Flashk

#54

spoiler
robpike25

problema típico de leetcode contest

day7: recursive approach con python, tengo prisa

spoiler
desu

Recursivo en rust test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.91s
Ahora me pongo a hacer con la stack.

Con la stack igual de timing, ejecutandole en modo debug/test, os dejo el codigo:

spoiler
Mandarino
day8
codigo
1 respuesta
robpike25

#59 Same

spoiler