Advent of Code 2024
(adventofcode.com)- Advent of Code, o evento de quebra-cabeças de programação de dezembro, foi projetado para reduzir as barreiras de nível de habilidade e de escolha de linguagem, permitindo participação para diversos fins, como prática, educação e competição
- Não é preciso ter formação em ciência da computação nem equipamentos de alto desempenho; todos os problemas têm uma solução que termina em no máximo 15 segundos em hardware de 10 anos atrás
- Se você travar na solução, é possível ir estreitando o problema na seguinte ordem: verificar os exemplos, criar seus próprios casos de teste, validar a entrada e pedir dicas a amigos ou no subreddit
- O FAQ de 2024 resume políticas operacionais como mudança na duração do evento, remoção do global leaderboard, regras de private leaderboard, uso de IA e restrições de cópia e redistribuição
- A competição por velocidade é opcional, e os participantes podem se concentrar em resolver os quebra-cabeças e aprender da forma que for útil para eles
Natureza do Advent of Code e requisitos para participar
- Advent of Code é um evento em formato de Advent calendar composto por pequenos quebra-cabeças de programação
- Os quebra-cabeças são voltados a vários níveis de habilidade e podem ser resolvidos na linguagem de programação que você preferir
- São usados para preparação para entrevistas, treinamentos em empresas, tarefas universitárias, exercícios de prática, competição por velocidade e desafios entre participantes
- Formação em ciência da computação não é obrigatória; um pouco de conhecimento de programação e capacidade de resolver problemas já bastam para participar
- Também não é necessário ter um computador de alto desempenho, e todos os problemas têm uma solução que termina em no máximo 15 segundos em hardware de 10 anos atrás
Procedimento de resolução quando você trava
- Se você travar na solução, primeiro deve validar o programa com os exemplos incluídos no quebra-cabeça
- Se o resultado dos exemplos não bater, releia a descrição do problema e verifique pontos que você entendeu errado ou comportamentos do programa diferentes do esperado
- Se os exemplos estiverem certos, mas a resposta final estiver errada, crie seus próprios casos de teste cuja resposta possa ser conferida manualmente e aplique-os ao programa
- Também é preciso verificar se toda a entrada do quebra-cabeça foi usada sem deixar nada de fora
- Se continuar travado, você pode pedir ajuda a um amigo ou tentar resolver mais tarde, e também pode receber dicas no subreddit
Uso do site e autenticação
- Blocos de código podem ser selecionados por inteiro com clique triplo se o JavaScript estiver ativado
- A autenticação usa OAuth para confirmar a identidade em serviços externos
- Ao fazer login, as credenciais são fornecidas apenas ao serviço externo correspondente, não ao Advent of Code
- O serviço externo informa ao servidor do Advent of Code que o usuário é quem diz ser
- Em geral, nenhuma informação adicional é revelada além daquelas que já são públicas
- O Advent of Code guarda o ID único, nome, URL e imagem do serviço de autenticação
- Se o texto do site for difícil de ler, é possível usar uma folha de estilos alternativa de alto contraste
- O Firefox oferece suporte nativo a View → Page Style → High Contrast
Dificuldade, horário de publicação e duração do evento
- A dificuldade e os temas dos quebra-cabeças variam a cada evento
- Em geral, os quebra-cabeças ficam mais difíceis com o passar do tempo, mas a dificuldade percebida pode variar muito conforme a combinação de habilidades de cada pessoa
- Os quebra-cabeças são publicados à meia-noite EST/UTC-5
- Isso porque esse é o horário em que o operador consegue verificar de forma estável se tudo está funcionando sem problemas
- Não há problema se você não puder participar à meia-noite, e competições locais podem usar private leaderboards
- A quantidade de dias do evento foi alterada
- Operar o Advent of Code exige muito tempo livre todos os anos, e a criação dos quebra-cabeças ocupa a maior parte desse tempo
- Depois de manter o cronograma por 10 anos, tornou-se necessária uma mudança
- Os quebra-cabeças começam em 1º de dezembro para que a numeração das datas corresponda, são publicados diariamente e terminam em meados de dezembro
Leaderboards e competição por velocidade
- O global leaderboard foi removido
- Ele era um dos maiores fatores de estresse para o operador, para a infraestrutura e para muitos usuários
- Alguns participantes levavam a competição a sério demais, chegando a ações como ataques DDoS
- Muitos usuários concluíam equivocadamente que eram programadores piores porque seu tempo era mais lento do que o de quem servia de comparação
- Começou em 2015 como um recurso divertido, mas ao longo de 10 anos se tornou um problema cada vez maior
- A visualização somente leitura de um private leaderboard pode ser compartilhada
- Esse recurso ou esses dados não devem ser usados para criar um novo global leaderboard
- Tempos de resolução rápidos são opcionais
- Para resolver rapidamente, são necessárias várias habilidades adicionais e muita prática além da solução dos quebra-cabeças
- Código de speed-solve muitas vezes parece totalmente diferente de código que passaria por uma revisão de código
- Não há problema em escolher uma abordagem alinhada aos objetivos que sejam úteis para você e ignorar completamente a competição por velocidade
Uso de IA e regras de private leaderboard
- Se você faz parte de um private leaderboard, deve verificar com o operador quais são as regras esperadas
- Se as regras não combinarem com você, é possível procurar outro private leaderboard ou criar o seu próprio
- As regras de um private leaderboard podem incluir tempo máximo de execução, linguagens permitidas, horário em que o quebra-cabeça pode ser aberto pela primeira vez, ferramentas que podem ser usadas e até se é necessário usar um chapéu ridículo enquanto trabalha
- O uso de IA não é recomendado para resolver quebra-cabeças do Advent of Code
- Em vez disso, é usada a analogia de perguntar se você poderia ficar mais forte mandando um amigo para a academia
- Os quebra-cabeças são projetados para serem interessantes quando resolvidos por pessoas, e não levam em conta se uma IA consegue resolvê-los
- Se o objetivo for praticar prompts de IA, outros exercícios projetados para esse propósito podem ser mais adequados
Ideias de quebra-cabeças, bugs e política de cópia
- Ideias de quebra-cabeças não devem ser enviadas
- Ideias não são aceitas por causa de questões legais como direitos autorais e attribution
- Para evitar a possibilidade de usar alguma parte por engano, e-mails que pareçam conter ideias de quebra-cabeças também não são lidos
- Se você acha que encontrou um bug em um quebra-cabeça, primeiro deve verificar no subreddit
- Uma hora após a publicação do quebra-cabeça, muita gente já o resolveu, então depois disso a possibilidade de bug é muito baixa
- O Advent of Code pode ser usado gratuitamente, mas não pode ser copiado livremente
- Não se deve incluir em repositórios de código partes do Advent of Code, como o texto dos quebra-cabeças ou a sua própria entrada
- Ao criar um site, ele não deve parecer o Advent of Code nem receber um nome semelhante
Avisos legais e escopo permitido
- Advent of Code é uma marca registrada nos Estados Unidos
- Elementos de design, textos, estilo e conceitos do Advent of Code são propriedade exclusiva do Advent of Code e não podem ser copiados ou usados sem consentimento explícito por escrito
- A indicação de copyright é 2015-2025 Advent of Code, com todos os direitos reservados
- É permitido linkar ou referenciar quebra-cabeças do Advent of Code em discussões, aulas, código-fonte, materiais impressos etc., inclusive em contextos comerciais
- O Advent of Code não reivindica propriedade nem copyright sobre a implementação das soluções dos usuários
1 comentários
Comentários do Hacker News
Gosto de AoC, então nos últimos 2~3 anos resolvi em Rust e me diverti no Discord fazendo, em grupo, a solução mais rápida possível
Nesse processo aprendi todo tipo de dica de otimização de desempenho, algoritmos avançados e SIMD
Desta vez estou resolvendo em Rust e Go para ver se vou passar a gostar ou pelo menos tolerar Go, que uso no trabalho, ou se vou confirmar a hipótese de que ele não é grande coisa e só devo usá-lo quando for realmente necessário
É prático, exige pouca configuração de ambiente ou trabalho paralelo, já traz embutida a maior parte do que você precisa, como leitura e parsing de arquivos, tem bom desempenho e é relativamente próximo do hardware, então há menos armadilhas de performance escondidas
Nunca usei Rust, então é difícil comparar, mas numa visão bem superficial ele parece menos prático
Como AoC não exige muito critérios de produção como segurança de memória, nos problemas mais avançados parece que praticidade e desempenho importam mais do que segurança
Todo ano tento otimizar velocidade com Zig: https://github.com/ManDeJan/advent-of-code
Na verdade, estou vivendo o dilema oposto, tentando gostar de Rust
Tentei fazer em Rust, mas não sei se devo separar por módulos por data, ou deixar cada data como arquivo de biblioteca e conectar tudo no ponto de entrada principal
Se tiver um repositório público, seria ótimo compartilhar
O desafio deste ano é escrever em C sem biblioteca padrão nem alocador
Precisa rodar em um STM32 com 32KB de SRAM
Dois anos atrás tentei em assembly, mas desisti depois de passar horas criando uma biblioteca padrão para assembly e migrei para Rust
Não avancei muito, mas sem proteção de memória fica realmente difícil
Este ano o Amiga tem um upgrade 060 com MMU, então talvez eu descubra como aproveitar isso e tente de novo
C também entrou, e foi um sofrimento enorme por não ter tabela hash
https://git.sr.ht/~q3cpma/aoc2024/tree/master/item/01
Eu agradeceria se você postasse o link do repositório para podermos acompanhar o progresso
No ano passado resolvi todos os problemas em C sem bibliotecas externas [1], e foi muito divertido
Isso me obrigou a implementar eu mesmo coisas de baixo nível que eu tinha esquecido, como heap, e também a escrever minhas próprias rotinas numéricas, o que foi mais fácil do que eu esperava
[1] https://github.com/sebastianotronto/aoc/tree/master/2023
grep pode, awk não, por exemplo; ainda seria uma limitação parecida, mas sem bugs fatais de corrupção de memória
Normalmente faço AoC em Common Lisp, mas este ano estou tentando Swift
Para uma linguagem estática mainstream, ela é bem decente para esse tipo de manipulação pequena
https://github.com/codr7/aoc24/tree/main/swift/Sources/aoc
Este ano está um pouco estranho, porque eu estava preparando um evento no emprego novo
Achei que seria útil para os desenvolvedores aprender a resolver problemas de verdade em vez de só ficar colando frameworks
Mas meu novo chefe acabou se revelando alguém com quem era impossível trabalhar, então precisei sair
No fim, como sempre, provavelmente vão sobrar só eu e o Emacs
É bem interessante comparar soluções diferentes
Tentei fazer AoC em Swift no passado, mas desanimei bastante por causa disso
Aquelas pequenas soluções funcionais de uma linha eram legais, mas depois de uma semana parecia que o peso do parsing ficaria grande demais
Eu queria tentar Swift este ano, mas abrir o Xcode só para fazer isso parece um exagero
Lá vamos nós de novo, a temporada de usar parsers de entrada cada vez mais complexos por 25 dias
O problema de verdade está em fazer o parsing da entrada para um formato fácil de manipular; depois que o parsing termina, fica fácil
O que fica mais complexo é o problema em si, e mesmo os problemas difíceis ali pelo dia 22 ou 23 normalmente ainda têm entradas do tipo linhas de inteiros separadas por espaço ou uma grade de pontos, bem parecido com os problemas fáceis dos dias 1 a 3
Este ano, a meta é juntar todas as estrelas e completar um total de 500 estrelas
Ou seja, terminar todos os anos e todos os problemas
Na semana passada, havia cerca de 1024 pessoas com 450 estrelas no total
Só comecei por volta do day 6 de 2022, mas acabei ficando viciado, e no começo de 2023 tive tempo para resolver os anos anteriores em sequência
Se você preparar alguns algoritmos com antecedência, não fica tão difícil, e também há temas que se repetem de ano para ano
É divertido reaprender coisas como algoritmos de verdade, que normalmente não uso com tanta frequência
Agradeço aos voluntários e ao Eric, e agora pretendo doar todos os anos. É um evento realmente ótimo
Gosto porque é um dos grandes destaques desta época do ano
Desta vez, tive que resolver dentro de um avião cruzando o Pacífico em direção ao leste
Pessoalmente, virou uma tradição divertida para mim, para amigos, colegas e para o pessoal do HN também
Fico impressionado mais uma vez com o que o wastl e os elfos ajudantes criaram
Quem tira valor disso aqui, se puder, faria bem em apoiar
É um projeto de paixão, mas também é verdade que há custos reais envolvidos
Ainda assim, adventofcode é realmente excelente, e vale a pena apoiar se possível
Dito isso, pelo volume de apoio que recebe hoje, o criador provavelmente está indo muito bem
Este ano vou tentar com F# e Gleam, mas, como em todo ano, provavelmente não vou ter tempo nem cabeça para ir além do dia 10~12
Quem usa Python deveria experimentar F# também
Pode parecer bem próximo de scripting, e também tem um REPL excelente
No primeiro ano, isso me motivou a criar uma biblioteca padrão para que não fosse entediante demais
Agora fico pensando que eu devia ter terminado ferramentas melhores
Depuro com o wsjq[1], um depurador de CLI tipo gdb feito em jq, mas é lento
[0]: https://github.com/thaliaarchi/ws-challenges
[1]: https://github.com/thaliaarchi/wsjq
Foi divertido até para alguém sem experiência com programação funcional
Este ano não tenho tempo para participar, mas, se fosse participar, provavelmente escolheria F# de novo
Ainda estou no começo da minha jornada funcional, mas até agora acho que o AoC tem ajudado
No ano passado, fiquei travado no Day 12 a semana inteira, e todo o meu tempo acordado foi consumido pensando em como resolver
Este ano vou ser um pouco mais gentil comigo mesmo, não vou participar e vou aproveitar de verdade as férias de inverno
Agora nem olho mais. A diversão vira estresse bem rápido
É importante estabelecer limites e aproveitar o tempo de descanso
Para mim, Advent of Code é uma ladeira escorregadia
À medida que a dificuldade aumenta, começa fácil, depois fica desafiador de um jeito recompensador, mas quando você percebe já está gastando tempo demais
E nessa altura é perigoso porque você já se envolveu emocionalmente
https://eli.li/december-adventure
Acabei tendo que escrever até um motor de grafos baseado em forças para encontrar as três arestas mais longas que precisavam ser cortadas
Depois que resolvi, fui ver as soluções de outras pessoas e tinha gente terminando em umas 10 linhas usando o resolvedor de proposições da Meta
Isso me pareceu uma trapaça absurda
Gosto de AoC
Não precisa se preocupar se bots de IA estão resolvendo, ou se outra pessoa acorda mais cedo; é só resolver pela própria diversão
Tanto faz se você gosta do desafio em si ou se quer testar uma linguagem nova
Eu gosto de resolver no estilo funcional de Kotlin justamente para fazer diferente do trabalho
Também postei a solução de hoje. Não é Kotlin puro porque usa utilitários, mas parte da diversão é justamente reunir funções legais e montar uma espécie de biblioteca
https://github.com/Matsemann/algorithm-problems/blob/main/ad...
Nos últimos anos usei Python NumPy, mas este ano estou usando Kotlin, e no problema do primeiro dia a função transpose foi a coisa de que mais senti falta
Meu código está aqui: https://github.com/charelF/AdventOfCode/blob/main/kt/src/y20...