Advent of Code 2024 - Queréis problemas?

Mandarino

¿De qué va esto?

El habitual calendario de adviento, solo que en vez de comer chocolate o maquillarte pues picas código como un buen artisan.

¿Dónde me apunto?

https://adventofcode.com/

¿Cuándo empieza?

Oficialmente el 1 de diciembre, seguir el calendario o no al pie de la letra es cuestión de cada uno. Las pruebas se ponen como a las 5AM hora española, así que sin estres.

Normas

  • Cada día se desbloquea un problema nuevo (2 partes)
  • Le dedicas el tiempo que te da la gana.
  • Resolver problemas de la forma que quieras. Programando en el lenguaje que quieras; haciendo un trozo a mano y otro con código; ...
  • Cada problema tiene una caja de texto para meter la solución (suelen ser números o alguna cadena de texto pequeña)
  • Usar ChatGPT esta prohibido por adventofcode (para el top100 ranking). Tampoco recomiendo usarlo ya que le quita todo el sentido.

Consejos

Lo importante es pasarlo bien y aprender algo nuevo. No pasa nada si no te salen los problemas, tú decides si quieres solucionar el problema 100% por tu cuenta o buscar ayuda despues de X horas intentandolo solucionar.

Leaderboard privado para el pique sano

NSFW

Si quieres ver más estadisticas en un leaderboard recomiendo esta extensión para Chrome:
Advent of Code charts

Las respuestas o ayudas se postean en Spoiler + code (indicad el día)

Premios

El honor y satisfacción de poder completar los problemas aumenta tu confianza e indirectamente aumenta tu calidad de vida.

Ediciones anteriores

2023
2022
2021
2020
2019

5
robpike25

Lo he hecho en Go, aunque en cuanto metan un Tree me paso a python rapidísimo xd

1
laZAr0

Ya me está dando toc por no poner el signo de apertura de interrogación en el título.

1
gonya707

He hecho el primero por los viejos tiempos pero en cuanto se compliquen un poco no voy a tener tiempo de hacerlos :_)

Pizzelio

Otro año por aquí, a ver lo que se aguanta xD

desu

Yo voy a hacer 10 ejercicios.

Solucion dia 1:

spoiler

Notes en el dia 1:

spoiler

Conclusion:

Problema simple, y como todos los problemas simples, muy facil cometer errores fundamentales cuando eres un mal programador o un incompetente. Si en lugar de un problema simple, fuese algo mas complejo, te pegas un tiro en el pie.

1 respuesta
Pizzelio

#6 Muy interesantes las notas, me pierdo con rust pero esto que comentas

spoiler

Aplicaría también a otros lenguajes no?

spoiler
1 respuesta
desu

#7 si claro, los fundamentos aplican a todos los lenguajes, si miras el assembly veras lo que haces. edit: los ejemplos son asumiendo una CPU teorica/de juguete, no una real, para que se entienda el concepto.

day 1

Aplica a otros lenguajes, aunque habria que entrar en los casos particulares y como funcionan debajo del capo. Los fundamentos basicos de programacion y arquitectura son eso, fundamentos basicos, al final todo es assembly (o byte-code) y unos y zeros no?

day 1

Conclusion: a tu pregunta, el performance de esa funcion, hacerlo de una manera optimo vs no optima, sera sobre x400 * numero de elementos. Esto en una CPU de juguete, para que se entienda el ejemplo.

spoiler
1
Flashk

Por mi parte:

Day 1
Comentarios Day 1
1
Kike_Knoxvil

Otro año más para no completarlo wiiii

Cerealfriend

Pensaba que iba a ser una tortura con Go parsear esto, pero con la lib de strings .Fields tardas nada:

dia 1
La segunda parte:
1 respuesta
pineda

#11

var left, right int
fmt.Sscanf(line, "%d   %d", &left, &right)

ahorrarás mucho código en los siguientes ejercicios con Sscanf

1
wolfie6949

Este año creo que no lo voy a empezar porque sé que no lo voy a terminar. Suerte compañeros.

desu

Hoy he decidio centrarme en un patron algoritmico muy habitual.

day 2

y una version habitual si no tienes pattern matching y tal, seria algo asi.

day2

edit: la parte 2 he querido ser listo y he tratado de hacer la solución optima antes de la fuerza bruta y he estado 1h... jaja

day 2
1 1 respuesta
ignasi_
day1
day2
1 respuesta
Mandarino
day2
Pizzelio

#14 Voy a investigar el patrón que comentas porque me cuesta seguirte la verdad xD

La parte 2 de hoy la he hecho por fuerza bruta pero no se me ocurría una forma que

spoiler
2 respuestas
desu

#17 pues el patron en python por ejemplo, si iteras un linked list o iteras en grafos, arboles...

previous = None
for current in row:
    if previous is not None:
        # el codigo ya esta init
   else: 
        # inicializas
       previous = current

o en una linked list que quieres ir avanzando

while node is not None:
  node = node.next

esto lo haras en todos los lenguajes ya sea comprovando un null, none, nil o teniendo un Optional/Option. Lo bueno de lo segundo y de rust es que es tan expresivo que te permitira hacer esto:

node, node.next = init()
match node, node.next:
   None, None => ... 
   Value, None => ...
   None, Value => ...
   Value, Value => ...

Y es muy facil de leer, en lenguajes funcionales es comun este patron, ahora java lo esta tratando de introducir con las switch expressions y nse no estoy muy al dia de lenguajes de porqueria.

#15 que lo esta haciendo en elixir también puede hacer patrones asi

spoiler
1 1 respuesta
Pizzelio

#18 Vale ahora sí, gracias!

JuAn4k4

Y pensar que hubo un tiempo en el que tenia tiempo para hacer esto… suerte a todos los parsers

Cerealfriend

Esta resuelto a fuerza bruta y simplemente chequeando por condiciones... en la parte 2 hago lo mismo ( #17 me diste la idea), creo slices de los que no se cumplem quitando 1 elem y comprobando si es safe con las mismas condiciones anteriores:

day 2 parte 1 y 2
2 1 respuesta
desu

#21

spoiler

si quieres mejorar tu day2 esta es una optimizacion que podrias copiarte bastante tal cual en go

spoiler
1 1 respuesta
eZpit

Me apunto de chills con Kotlin y no pienso hacer premature optimizations ni tests, y seguramente caiga en cuanto se ponga tedioso y largo.

Day 02
desu

Dia 3 y ya toca picarse un compilador!

Mi solución, hoy facil, creo que he estado 10 minutos:

ignasi_
day3

Me ha costado un poco, estoy poco acostumbrado a las regexs y menos en elixir. Supongo que usando capture groups hubiese sido mejor la parte 1.

Pizzelio

Bastante amable el de hoy, en preparación de lo que se viene seguro jajaja

spoiler
Mandarino
day3
Flashk
day 3
Cerealfriend

Me dió tiempo a hacer la parte 1 usando tamb regex y capture groups para los values pero la segunda no me ha salido,.. osea si tengo un do habilitó las multiplicaciones y si encuentro un dont las deshabilito hasta el siguiente do cierto??? Se me ha pasado mirar si estaba haciéndolo todo en 1 string, porq paseando a línea puede estar el fallo... Mañana saco los 2 si o si.

#22 tyvm, quiero intentar todos estos puzzles, primero que me salgan y luego hacer cosas como esa, con el de regex de hoy me sirve para leerme doc y entender mejor y como aplicar regex por ejemplo

Mandarino
day4