Advent of Code 2024
(adventofcode.com)- Advent of Code, el evento de rompecabezas de programación de diciembre, está diseñado para reducir las barreras de nivel y de elección de lenguaje, para que se pueda participar con distintos fines como práctica, educación o competencia
- No hace falta tener formación en ciencias de la computación ni equipo de alto rendimiento, y todos los problemas tienen una solución que termina en un máximo de 15 segundos en hardware de hace 10 años
- Si te atoras al resolver, puedes ir acotando el problema en este orden: revisar los ejemplos, crear tus propios casos de prueba, validar la entrada y luego pedir ayuda a amigos o buscar pistas en el subreddit
- En el FAQ de 2024 se resumen políticas de operación como el cambio en la duración del evento, la eliminación del global leaderboard, las reglas de los private leaderboards, el uso de IA y las restricciones sobre copia y redistribución
- La competencia por velocidad es opcional, y los participantes pueden enfocarse en resolver y aprender de la forma que más les sirva
Naturaleza de Advent of Code y requisitos para participar
- Advent of Code es un evento con formato de calendario de Adviento compuesto por pequeños rompecabezas de programación
- Los rompecabezas están dirigidos a distintos niveles de habilidad y se pueden resolver en el lenguaje de programación que prefieras
- Se usa para preparación de entrevistas, capacitación en empresas, tareas universitarias, ejercicios de práctica, competencias de velocidad y desafíos entre participantes
- No es obligatorio tener formación en ciencias de la computación; basta con algo de conocimiento de programación y capacidad de resolver problemas
- Tampoco hace falta una computadora potente, y todos los problemas tienen una solución que termina en un máximo de 15 segundos en hardware de hace 10 años
Procedimiento de resolución cuando te atoras
- Si te atoras, primero debes validar tu programa con los ejemplos incluidos en el rompecabezas
- Si el resultado del ejemplo no coincide, vuelve a leer la descripción del problema y revisa qué parte entendiste mal o en qué se comporta tu programa distinto de lo esperado
- Si el ejemplo está bien pero la respuesta sigue siendo incorrecta, crea por tu cuenta casos de prueba cuyos resultados puedas verificar a mano y aplícalos a tu programa
- También debes comprobar que estés usando toda la entrada del rompecabezas sin omitir nada
- Si sigues atorado, puedes pedir ayuda a un amigo o intentarlo más tarde, y también puedes recibir pistas en el subreddit
Uso del sitio y autenticación
- Los bloques de código se pueden seleccionar completos con triple clic si JavaScript está habilitado
- La autenticación usa OAuth para verificar tu identidad mediante servicios externos
- Al iniciar sesión, tus credenciales no se entregan a Advent of Code sino solo al servicio externo correspondiente
- El servicio externo le informa al servidor de Advent of Code que eres quien dices ser
- Por lo general no se revela información adicional aparte de la que ya es pública
- Advent of Code recuerda el ID único del servicio de autenticación, el nombre, la URL y la imagen
- Si el texto del sitio te cuesta leerlo, puedes usar una hoja de estilo alternativa de alto contraste
- Firefox lo admite de forma nativa con View → Page Style → High Contrast
Dificultad, hora de publicación y duración del evento
- La dificultad y la temática de los rompecabezas cambian de un evento a otro
- En general, los rompecabezas se vuelven más difíciles con el paso del tiempo, pero la dificultad percibida puede variar mucho según la combinación de habilidades de cada persona
- Los rompecabezas se publican a la medianoche EST/UTC-5
- Porque es el horario en el que el operador puede comprobar de forma confiable que todo funcione sin problemas
- No pasa nada si no puedes participar a medianoche, y para la competencia local se pueden usar los private leaderboards
- La cantidad de días del evento cambió
- Mantener Advent of Code requiere mucho tiempo libre cada año, y crear los rompecabezas ocupa la mayor parte de ese tiempo
- Después de mantener el calendario durante 10 años, hizo falta un cambio
- Los rompecabezas comienzan el 1 de diciembre para coincidir con la numeración de fechas, se publican a diario y terminan a mediados de diciembre
Leaderboards y competencia de velocidad
- El global leaderboard fue eliminado
- Era una de las mayores fuentes de estrés para el operador, la infraestructura y muchos usuarios
- Algunos participantes se tomaban la competencia demasiado en serio y hubo conductas como ataques DDoS
- Muchas personas llegaban a la conclusión equivocada de que eran peores programadores solo porque sus tiempos eran más lentos que los de otros
- Empezó en 2015 como una función divertida, pero durante 10 años se convirtió en un problema cada vez mayor
- La vista de solo lectura del private leaderboard se puede compartir
- No se debe usar esta función ni esos datos para crear un nuevo global leaderboard
- Los tiempos rápidos son opcionales
- Resolver rápido requiere muchas habilidades adicionales y mucha práctica, además de resolver los rompecabezas en sí
- El código para speed-solving muchas veces se ve completamente distinto de un código que pasaría una revisión
- Está bien elegir un enfoque alineado con tus propios objetivos e ignorar por completo la competencia de velocidad
Uso de IA y reglas de los private leaderboards
- Si perteneces a un private leaderboard, debes revisar con su operador cuáles son las reglas esperadas
- Si las reglas no te acomodan, puedes buscar otro private leaderboard o crear uno propio
- Las reglas de un private leaderboard pueden incluir tiempo máximo de ejecución, lenguajes permitidos, cuándo se puede abrir el rompecabezas por primera vez, qué herramientas se pueden usar e incluso si hay que usar un sombrero ridículo mientras trabajas
- No se recomienda usar IA para resolver los rompecabezas de Advent of Code
- En su lugar se usa la analogía de mandar a un amigo al gimnasio esperando que eso te haga más fuerte a ti
- Los rompecabezas están diseñados para que sean interesantes cuando los resuelven personas, y no se considera si una IA puede resolverlos o no
- Si tu objetivo es practicar prompts para IA, quizá te convenga más otro tipo de ejercicio diseñado para eso
Ideas de rompecabezas, bugs y política de copia
- No se deben enviar ideas de rompecabezas
- No se aceptan ideas por cuestiones legales como derechos de autor y attribution
- Para evitar siquiera la posibilidad de usar algo por accidente, tampoco se leen correos que parezcan contener ideas de rompecabezas
- Si crees que encontraste un bug en un rompecabezas, primero deberías revisarlo en el subreddit
- Una vez pasada una hora desde la publicación del rompecabezas, la probabilidad de que tenga un bug ya es muy baja porque mucha gente ya lo habrá resuelto
- Advent of Code se puede usar gratis, pero no se puede copiar libremente
- No debes incluir partes de Advent of Code, como el texto de los rompecabezas o tus propias entradas, en un repositorio de código
- Al crear un sitio web, no debes hacer que parezca Advent of Code ni ponerle un nombre similar
Aviso legal y alcance permitido
- Advent of Code es una marca registrada en Estados Unidos
- Los elementos de diseño, el texto, el estilo y los conceptos de Advent of Code son propiedad exclusiva de Advent of Code y no se pueden copiar ni usar sin consentimiento expreso por escrito
- El aviso de copyright es 2015-2025 Advent of Code y todos los derechos están reservados
- Se puede enlazar o hacer referencia a los rompecabezas de Advent of Code en discusiones, clases, código fuente, material impreso y otros contextos, incluso comerciales
- Advent of Code no reclama propiedad ni copyright sobre las implementaciones de solución de los usuarios
1 comentarios
Opiniones en Hacker News
Me gusta AoC, así que durante los últimos 2 o 3 años lo resolví en Rust, y en Discord jugábamos a crear entre todos la solución más rápida.
En ese proceso aprendí todo tipo de trucos de optimización de rendimiento, algoritmos avanzados y SIMD.
Esta vez lo estoy resolviendo en Rust y Go para ver si termino queriendo o pudiendo tolerar Go, que uso en el trabajo, o si confirmo la hipótesis de que no me gusta y lo uso solo cuando sea estrictamente necesario.
Es práctico, requiere poca configuración del entorno o trabajo accesorio, trae integradas la mayoría de las funciones necesarias como leer archivos y parsear, tiene buen rendimiento y está bastante cerca del hardware, así que hay menos trampas de rendimiento ocultas.
Nunca usé Rust, así que es difícil comparar, pero visto muy superficialmente me parece menos práctico.
En AoC no se necesitan tanto criterios de producción como seguridad de memoria, así que en los problemas posteriores la practicidad y el rendimiento parecen más importantes que la seguridad.
Cada año intento optimizar velocidad con Zig: https://github.com/ManDeJan/advent-of-code
Más bien tengo el dilema opuesto: intentar que me guste Rust.
Intenté hacerlo en Rust, pero no me queda claro si debería dividirlo en módulos por fecha o poner cada día como archivo de biblioteca y conectarlo con el punto de entrada principal.
Si tienen un repositorio público, estaría bueno que lo compartan.
El desafío de este año es escribirlo en C sin biblioteca estándar ni asignador.
Debe poder ejecutarse en un STM32 con 32 KB de SRAM.
Hace dos años lo intenté en ensamblador, pero después de pasar horas creando una biblioteca estándar para ensamblador me rendí y cambié a Rust.
No avancé demasiado; sin protección de memoria se vuelve realmente difícil.
Este año tengo una actualización 060 con MMU en la Amiga, así que quizá pueda averiguar cómo aprovecharla y volver a intentarlo.
Incluí C, y fue realmente doloroso por no tener tablas hash.
https://git.sr.ht/~q3cpma/aoc2024/tree/master/item/01
Te agradecería que publiques un enlace al repositorio para poder ver el progreso.
El año pasado resolví todos los problemas en C sin bibliotecas externas [1], y fue muy divertido.
Me hizo implementar por mi cuenta elementos de bajo nivel que tenía olvidados, como el heap, y también escribir rutinas numéricas; fue más fácil de lo que esperaba.
[1] https://github.com/sebastianotronto/aoc/tree/master/2023
Algo como permitir grep pero no awk: igual de restrictivo, pero sin bugs fatales de corrupción de memoria.
Normalmente hago AoC en Common Lisp, pero este año estoy probando Swift.
Para ser un lenguaje mainstream de tipado estático, se porta bastante bien con estas pequeñas manipulaciones.
https://github.com/codr7/aoc24/tree/main/swift/Sources/aoc
Este año fue un poco raro: estaba preparando el evento en mi nuevo trabajo.
Pensaba que podía ser útil para que los desarrolladores aprendieran a resolver problemas reales, en vez de solo unir frameworks.
Pero mi nuevo jefe resultó ser alguien con quien era imposible trabajar, así que tuve que irme.
Al final parece que, como siempre, solo quedaremos yo y Emacs.
Es bastante interesante comparar soluciones distintas.
Hace tiempo intenté hacer AoC en Swift, pero esa parte me desmotivó mucho.
Las pequeñas soluciones funcionales de una línea estaban buenas, pero después de una semana más o menos siento que la carga de parsing se volvería demasiado pesada.
Este año quería probar Swift, pero abrir Xcode para esto me parece un poco excesivo.
Volvió otra vez: la temporada de pasar 25 días escribiendo parsers de entrada cada vez más complejos.
El verdadero problema está en parsear la entrada a una forma manejable; una vez que terminas de parsearla, se vuelve fácil.
Lo que se vuelve más complejo es el problema en sí, y aun los problemas difíciles de los días 22 o 23 suelen tener entradas parecidas a las de los problemas fáciles de los días 1 a 3, como líneas de enteros separados por espacios o una grilla de puntos.
Este año mi objetivo es juntar todas las estrellas y llegar a un total de 500 estrellas
Es decir, terminar todos los años y todos los problemas
Hasta la semana pasada, había unas 1024 personas con 450 estrellas en total
Empecé recién por el día 6 de 2022, pero me enganché, y a principios de 2023 tuve tiempo para resolver de corrido los años anteriores
Si tienes preparados algunos algoritmos, no es tan difícil, y también hay temas que se repiten cada año
Es divertido volver a practicar cosas como algoritmos reales que uno no suele tocar en el día a día
Gracias a los voluntarios y a Eric; de ahora en adelante pienso donar todos los años. Es un evento realmente excelente
Me gusta porque es uno de los puntos altos de esta época
Esta vez tuve que resolverlo en un avión cruzando el Pacífico hacia el este
Se volvió una tradición divertida para mí, para amigos, colegas y la gente de HN
Una vez más, me parece increíble que wastl y los elfos ayudantes lo creen
Quienes obtienen valor de esto deberían apoyar el proyecto si pueden
Aunque sea un proyecto pasional, también es cierto que tiene costos reales
Aun así, adventofcode es realmente excelente, y está bien apoyarlo si se puede
Pero, viendo el nivel de apoyo que recibe actualmente, imagino que el creador debe estar bastante bien
Este año quiero intentarlo con F# y Gleam, pero como todos los años, no creo tener tiempo ni cabeza para más de 10 a 12 días
A quienes usan Python les recomendaría probar F# alguna vez
Puede sentirse bastante cercano al scripting y tiene un REPL excelente
El primer año me motivó a crear una biblioteca estándar para que no fuera demasiado tedioso
Ahora pienso que ojalá hubiera terminado mejores herramientas
Depuro con wsjq[1], un depurador CLI tipo gdb escrito en jq, pero es lento
[0]: https://github.com/thaliaarchi/ws-challenges
[1]: https://github.com/thaliaarchi/wsjq
Incluso para alguien sin experiencia en programación funcional, fue divertido
Este año no tengo tiempo para participar, pero si lo hiciera probablemente volvería a elegir F#
Todavía estoy al inicio de mi camino funcional, pero hasta ahora creo que AoC me ha ayudado
El año pasado me quedé atascado toda una semana en el Day 12, y consumió todas mis horas despierto pensando en cómo resolverlo
Este año voy a ser un poco más amable conmigo mismo: no voy a participar y quiero disfrutar bien mis vacaciones de invierno
Ahora directamente no lo miro. La diversión se convierte en estrés bastante rápido
Es importante poner límites y disfrutar el tiempo de descanso
Para mí, Advent of Code es como una pendiente resbaladiza
Al subir la dificultad, al principio es fácil, luego difícil de una forma gratificante, pero de pronto ya le estás dedicando demasiado tiempo
Para ese momento, ya estás emocionalmente invertido, y eso es peligroso
https://eli.li/december-adventure
Tuve que escribir incluso un motor de grafos basado en fuerzas para encontrar las tres aristas más largas que había que cortar
Después de resolverlo, vi las soluciones de otras personas y resulta que lo terminaban en unas 10 líneas usando el solucionador proposicional de Meta
A mí me pareció un atajo tremendo
Me gusta AoC
No hace falta preocuparse por si lo resuelven bots de IA o si alguien se levanta más temprano; basta con resolverlo por diversión propia
Da igual si es por el desafío en sí o para probar un lenguaje nuevo
A mí me gusta resolverlo en Kotlin con estilo funcional tanto como pueda, para hacerlo distinto de mi trabajo
También publiqué la solución de hoy. Como uso utilidades, no es Kotlin puro, pero reunir funciones interesantes y armar una especie de biblioteca también es parte de la diversión
https://github.com/Matsemann/algorithm-problems/blob/main/ad...
Los últimos años usé Python NumPy y este año estoy usando Kotlin; en el problema del primer día, la función transpose fue lo que más extrañé
Mi código está aquí: https://github.com/charelF/AdventOfCode/blob/main/kt/src/y20...