1 puntos por GN⁺ 2024-12-02 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2024-12-02
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.

    • En los últimos años lo resolví en Go, y aunque después del día 6 siempre me faltó tiempo o concentración para seguir, para este tipo de uso me pareció bastante bueno.
      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.
    • Me interesa el enfoque para resolver rápido en Rust; si tienes algún enlace para compartir, me gustaría verlo.
    • Estaría bueno que compartieras el Discord.
      Cada año intento optimizar velocidad con Zig: https://github.com/ManDeJan/advent-of-code
    • Go no es "Golang", tiene mejores tiempos de compilación que Rust y no intenta combinar a la fuerza modelos de concurrencia que no encajan entre sí.
      Más bien tengo el dilema opuesto: intentar que me guste Rust.
    • Me da curiosidad cómo organizan un proyecto de AoC.
      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.

    • El año pasado lo hice en C sobre una Amiga 1200 real, usando el compilador/runtime de Matt Dillon llamado DICE.
      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.
    • Este año también voy con Common Lisp, pero decidí resolver el problema del primer día en todos los lenguajes que "sé".
      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.
    • Esa restricción suena bastante difícil, pero buena suerte.
      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
    • Si puedes hacer llamadas RPC, puedes hacer cualquier cosa incluso con 32 KB de RAM :-)
    • Por simetría, también valdría la pena considerar usar solo sh y herramientas CLI estándar que no sean Turing completas.
      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.

    • Si todavía no lo hiciste, estaría bueno que participes en el leaderboard de Swift: https://forums.swift.org/t/advent-of-code-2024
      Es bastante interesante comparar soluciones distintas.
    • Me pregunto si parsear y manipular strings en Swift no es bastante doloroso.
      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.
    • Me pregunto si escribes, compilas y ejecutas las soluciones todo desde Emacs.
      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.

    • Esos problemas son los que más odio.
      El verdadero problema está en parsear la entrada a una forma manejable; una vez que terminas de parsearla, se vuelve fácil.
    • Después de unos días termino usando expresiones regulares, y como cada año se me olvidan, tengo que volver a aprenderlas.
    • Los parsers de entrada no se vuelven más complejos a medida que avanzan los días.
      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.
    • Es que le agregan una historia interesante al parsing de la entrada.
    • Creo que scanf y una máquina de estados son mucho más efectivos que un parser estilo split/explode.
  • 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

    • Con tantos patrocinadores y usuarios de AoC++, parece difícil verlo como un pequeño proyecto pasional al que le cuesta pagar la suscripción mensual de un VPS
      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

    • Sigo con la tradición de resolver AoC en Whitespace [0]
      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
    • Lo estoy haciendo en bash, para ver hasta dónde puedo llegar
    • Los últimos dos AoC los hice en F#, aunque en realidad solo hice los primeros días
      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#
    • Yo también empecé a aprender F# y lo estoy usando en el AoC de este año
      Todavía estoy al inicio de mi camino funcional, pero hasta ahora creo que AoC me ha ayudado
    • Me da curiosidad cómo está el soporte en Linux :)
  • 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

    • Me consumió la vida varios años seguidos, y dos veces terminé apenas en Nochebuena
      Ahora directamente no lo miro. La diversión se convierte en estrés bastante rápido
    • Suena sensato
      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
    • Un amigo compartió esto hace poco, y creo que te podría gustar
      https://eli.li/december-adventure
    • Me quedé atascado cuatro meses en el rompecabezas de corte de grafos
      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...