Advent of Code 2023 Day 13: Point of Incidence

Cover Photo

Foto de Capa gerada por IA

Agora chegando na Lava land e após ser lançado das águas termais você encontra o lugar praticamente sem lava!

Ao ir em direção as montanhas mais próximas para investigar, você nota alguns espelhos em um vale que parecem estar alinhados perfeitamente para causar ilusões de ótica. Observando melhor o vale é perceptível também que existe um padrão entre eles e talvez seja melhor investigar onde é seguro pisar para não se machucar.

O seu input é um ajuntado de padrões de terrenos que foram visualizados e alguns terrenos possuem espelhos que fazem parte do terreno refletir, deixando o terreno maior do que realmente é.

Seu trabalho é desobrir onde estão os espelhos para poder caminhar de forma segura.

Contexto específico

Seu input possui diversos terrenos (terrains) e você deve descobrir onde está posicionado o espelho que está refletindo exatamente o terreno.

O reflexo pode aparecer de forma horizontal ou vertical e dependendo de onde estiver podem existir linhas que “sobrem” ao final/início da linha/coluna. O importante é que todo o terreno refletido seja idêntico ao original.

Resolução Parte 1

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

Para solucionar o desafio, decidi que para cada terreno seria realizado

  • busca das linhas/colunas repetidas sequenciais
  • montagem de uma estrutura que contivesse as linhas subsequêntes que deveriam combinar de forma idêntica
  • iteração sobre a estrutura para validar se realmente era o caso de um espelho

Como resultado final, caso fosse encontrado um espelho, o valor seria somado a um valor total sendo que:

  • No caso de um espelho vertical, as linhas entre o espelho e o começo do terreno seriam somadas
  • No caso de um espelho horizontal, as linhas entre o espelho e o começo do terreno seriam multiplicadas por 100 e esse valor, somado

Para a implementação, foi utilizado novamente o módulo Square() (que pode ser visualizado nesse arquivo) adicionando algumas funções auxiliares internas. Considerando apenas a busca de valores por linha, o código possui essa estrutura:

const findTerrainLineMatchValue = ({ terrain }) => {
  const terrainSquareObj = Square({ data: terrain })

  const terrainSquare = terrainSquareObj.getSquare()
  const [maxRow, maxCol] = terrainSquareObj.getMaxLimits()

  const matchesMap = buildMatchesMap({ terrainSquare, maxRow })

  const lineMatchValue = findMatchValue({
    matchesMap: matchesMap,
    terrain: terrainSquare,
  })
  
  return lineMatchValue * 100
}

Vale notar que essa função deve ser executada para cada terreno e um código similar deve ser executado também para cada terreno mas buscando nas colunas.

Uma função que auxilia na inversão do square gerado é a função Square.getInversedSquare(). Com ela, obtemos a estrutura “invertida” do square e essa estrutura pode ser usada para deixar as funções auxiliares genéricas o suficiente para não terem que se preocupar com qual direção estão operando.

Algo que vale salientar é que podem existir mais de uma ocorrência de duas linhas/colunas sendo iguais mas isso não caracteriza uma ocorrência de um espelho! A ocorrência do espelho acontece apenas caso todas as outras linhas/colunas sejam respectivamente idênticas.

Obtendo então os valores e somando para cada terreno, chegamos ao resultado da solução para o desafio!

E novamente habilita-se a parte 2 do desafio: Agora, cada espelho reflete o terreno com a ocorrência de especificamente 1 item do terreno “trocado”. Isso faz com que os espelhos encontrados previamente agora possam não fazer mais sentido no terreno.

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: