Advent of Code 2023 Day 18: Lavaduct Lagoon

Cover Photo

Foto de Capa gerada por IA

Com as máquinas funcionando a todo vapor agora os Elfos vão precisar de uma quantidade relativamente grande de lava mas não tem onde armazenar. Para resolver esse problema eles tem um “plano”: Cavar um buraco no chão para abrir uma Lagoa de Lava.

Para sua surpresa os Elfos possuem um mapa (seu input) e você decide avaliar quanto de lava poderá ser guardado na lagoa de lava.

Contexto específico

No seu input cada linha representa a direção para se deslocar cavando (em linha reta) e quanto se mover (números inteiros) naquela direção

<direção> <quantidade de unidades> (<cor rgb>)

A cor não será importante para a resolução da primeira parte do desafio, portanto será omitida daqui para frente.

Cada buraco cavado gera 1 metro cúbico (m3) e cada unidade interna da lagoa também gera 1 m3. Para encontrar a solução do seu desafio, é preciso calcular qual será o volume final da lagoa de lava.

Resolução Parte 1

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

Na primeira parte optei por “desenhar” a lagoa ao invés de buscar uma fórmula. Para o input de teste na descrição a solução foi relativamente simples e um grid de 30x30 conseguiu resolver o problema.

As funções auxiliares são chamadas da seguinte forma

fillDigMap(lines)

getOffsets()

drawGridLines()

openHoles()

const volume = evaluateVolume()

As funções auxiliares são bem descritivas mas vale comentar a respeito de cada uma

  • fillDigMap() - responsável por preencher um Map() com todos os pontos de vértice dos buracos que seriam cavados
  • getOffsets() - como não se sabe o ponto inicial, para usar o ponto [0, 0] precisamos descobrir os offsets para esse ponto e ter a certeza que teremos espaço para acomodar todo a representação da lagoa
  • drawGridLines() - responsável por efetivamente desenhar os “buracos” cavados das bordas com o caractere # no grid baseado nos passos do DIG_MAP
  • openHoles() - preenche o grid com o caractere 0 na parte interna da lagoa, baseado as bordas que estão presentes

Para encontrar a solução final foi necessário um grid de 300x600 baseado no input que foi fornecido.

Também é interessante mencionar que a função openHoles() tem lógica para

  • Começar a iterar apenas a partir da primeira borda da linha
  • Parar de iterar na última borda da linha
  • Descobrir se o ponto atual é interno ou externo a lagoa

Com a primeira parte da solução resolvida, fica liberada a segunda parte. Já na descrição foi possível descobrir que seria melhor ter feito uma abordagem através de uma fórmula ao invés de desenhar o grid visto que agora o grid seria muito maior.

Nota: Ainda estou resolvendo a segunda parte desse desafio!

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 Array:

Métodos String: