Advent of Code 2023 Day 02: Cube Conundrum

Cover Photo

Foto de Capa gerada por IA

Após ser lançado para as nuvens, você aterrisa em uma ilha flutuante (?) no céu. O Elfo que te encontra diz que esta é a Ilha de Neve mas que está sem neve. Ele relata que pode contar o que aconteceu enquanto caminham e propõe um jogo com blocos de três cores: Verdes, Azuis e Vermelhos.

O jogo consiste no elfo esconder uma quantidade de cubos variados em uma bolsa e tirar um punhado desses pequenos cubos algumas vezes para que você possa adivinhar quantos cubos existem na bolsa, sem olhar diretamente dentro da bolsa.

Contexto específico

Cada linha de texto do input consiste em uma rodada do jogo, apresentando o id do mesmo, e quantos cubos o Elfo mostrou a você de cada cor separados por um ponto-e-vírgula.

Também é comentado que existe um número máximo de cubos de cada cor que existe para jogar. No meu caso, eram:

  • 12 vermelhos
  • 13 verdes
  • 14 azuis

A resposta para o seu desafio é a soma dos ids com todos os jogos válidos. O jogo é considerado válido se o Elfo te mostrou um valor de cubos igual ou menor ao número máximo para aquela cor de cubo.

Resolução Parte 1

Caso queira resolver antes de ler a respeito de minha solução, esse é o momento!

Notei que exisita um padrão no texto apresentado em cada linha do input e preferi tomar uma abordagem parecida com o dia anterior: usando Expressões Regulares (RegExp). Cada linha possui o formato:

Game <gameId>: <cubos-jogada-1>; <cubos-jogada-2>; ... <cubos-jogada-n>

Bastava então: iterar sobre cada linha, validar os cubos apresentados e caso fosse um jogo válido somar o gameId daquele jogo.

let sumPossibleGames = 0

for (const line of lines) {
  const maxPresentedCubes = filterMaxPresentedCubesFromLine(line)

  if (isPossibleHand(maxPresentedCubes)) {
    const [gameId] = line.match(/(\d+)/)
    sumPossibleGames += Number(gameId)
  }
}

Ao resolver a primeira parte a segunda parte do desafio fica disponível novamente e o Elfo menciona que o gameId não importa mais. Agora o Elfo pede que a soma seja dos valores mínimo de cubos de cada cor em um jogo, multiplicados entre si. Também não importa mais se o jogo é “possível”.

Resolução Parte 2

Novamente, Caso queira resolver a segunda parte antes de ler a respeito de minha solução, interrompa sua leitura aqui mesmo!

Confesso que essa segunda parte foi relativamente simples, visto que a solução da parte 1 já contemplava obter o número mínimo de cubos de cada cor apresentado em cada jogo. Foi apenas necessário multiplicar os valores de cubos de cada cor a cada rodada e somar tudo no final.

let sumOfGamePowers = 0

for (const line of lines) {
  const presentedCubes = filterMaxPresentedCubesFromLine(line)

  let gamePower = 1
  for (const color in presentedCubes) {
    gamePower = gamePower * Number(presentedCubes[color])
  }

  sumOfGamePowers += gamePower
}

Como mencionei, é possível observar que reaproveitei a função filterMaxPresentedCubesFromLine() da primeira parte para conseguir os valores dos cubos mostrados.

Com esse detalhe resolvido, reaproveitei a função da primeira parte e cheguei ao resultado final para a segunda parte.

Referências

O código final esta disponível no repositório do GitHub. Esses são alguns links que podem te auxiliar a compreender melhor o código e cada detalhe que mencionei ou esqueci de comentar a respeito de minha solução:

Métodos String: