Advent of Code 2023 Day 18: Lavaduct Lagoon
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 umMap()
com todos os pontos de vértice dos buracos que seriam cavadosgetOffsets()
- como não se sabe o ponto inicial, para usar o ponto[0, 0]
precisamos descobrir osoffsets
para esse ponto e ter a certeza que teremos espaço para acomodar todo a representação da lagoadrawGridLines()
- responsável por efetivamente desenhar os “buracos” cavados das bordas com o caractere#
nogrid
baseado nos passos doDIG_MAP
openHoles()
- preenche o grid com o caractere0
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: