1 pontos por GN⁺ 2024-12-02 | 1 comentários | Compartilhar no WhatsApp
  • 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

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

    • Resolvi em Go nos últimos anos e, embora eu sempre tenha ficado sem tempo ou concentração para avançar muito depois do dia 6, ele foi bem bom para esse tipo de uso
      É 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
    • Tenho curiosidade sobre a abordagem para resolver rápido em Rust; se houver algum link que valha compartilhar, eu gostaria de ver
    • Seria legal se você pudesse compartilhar o Discord
      Todo ano tento otimizar velocidade com Zig: https://github.com/ManDeJan/advent-of-code
    • Go não é "Golang", tem tempo de compilação melhor que Rust e não tenta forçar a combinação de formas incompatíveis de usar concorrência
      Na verdade, estou vivendo o dilema oposto, tentando gostar de Rust
    • Fiquei curioso sobre como você organiza o projeto do AoC
      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

    • No ano passado eu fiz em C num Amiga 1200 de verdade, usando o compilador/runtime DICE do Matt Dillon
      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
    • Este ano vou de Common Lisp de novo, mas no problema do primeiro dia decidi resolver em todas as linguagens que eu "conheço"
      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
    • Essa restrição parece bem difícil, mas boa sorte
      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
    • Se só puder fazer chamadas RPC, dá para fazer qualquer coisa dentro de 32KB de RAM :-)
    • Pensando de forma simétrica, também daria para considerar usar apenas sh e ferramentas CLI padrão que não sejam Turing-completas
      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

    • Se ainda não fez isso, seria bom participar do leaderboard de Swift: https://forums.swift.org/t/advent-of-code-2024
      É bem interessante comparar soluções diferentes
    • Tenho curiosidade se parsing e manipulação de strings em Swift não são bem dolorosos
      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
    • Fiquei curioso se você escreve a solução, compila e executa tudo no Emacs
      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

    • Esses problemas são os que eu mais odeio
      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
    • Depois de alguns dias, no fim você acaba usando regex, e todo ano esquece e tem que aprender de novo
    • Não é que os parsers de entrada fiquem mais complexos conforme os dias passam
      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
    • É só uma história divertida colocada em cima do parsing de entrada
    • Na minha opinião, scanf e máquinas de estado são muito mais eficazes do que parsers no estilo split/explode
  • 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

    • Com tantos patrocinadores e usuários do AoC++, parece difícil chamar isso de um pequeno projeto de paixão que mal consegue pagar a assinatura mensal de um VPS
      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

    • Estou mantendo a tradição de resolver o AoC em Whitespace [0]
      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
    • Estou fazendo em bash e vendo até onde consigo ir
    • Fiz os dois últimos AoC em F# e, na verdade, só encarei os primeiros dias
      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
    • Eu também comecei a aprender F# e estou usando no AoC deste ano
      Ainda estou no começo da minha jornada funcional, mas até agora acho que o AoC tem ajudado
    • Queria saber como está o suporte a Linux :)
  • 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

    • Isso consumiu minha vida por vários anos seguidos, e em duas vezes eu só terminei na véspera de Natal
      Agora nem olho mais. A diversão vira estresse bem rápido
    • Parece sensato
      É 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
    • Um amigo compartilhou isso comigo recentemente, acho que você vai gostar
      https://eli.li/december-adventure
    • Fiquei travado por quatro meses no quebra-cabeça de corte em grafo
      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...