Advent of Code 2023 Day 01: Trebuchet?!

Cover Photo

Foto de Capa gerada por IA

Para dar um contexto lúdico, o Advent of Code cria uma narrativa onde você deve auxiliar os Elfos que ajudam a preparação para o Natal. Esse ano existe um problema com a produção de neve global e você foi escolhido para ajudar. Como primeiro problema exite um documento de calibração que auxilia a calibrar uma espécie de Catapulta. Porém, o documento foi adulterado por algum elfo recém contratado.

Contexto específico

Esse documento de calibração é seu input e você deve juntar o primeiro e o último dígito que aparece em cada linha e somar todos esses valores. A resposta para o seu desafio é a soma de todos esses valores do documento de calibração.

Resolução Parte 1

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

Para resolver esse problema decidi iterar pelas linhas do input buscando o primeiro e o último dígito numérico usando Expressões Regulares (ou RegExp). Na sequência eu juntei os dígitos para produzir um número decimal e somei todos os valores de calibração para obter meu resultado.

let calibrationSum = 0

for (const line of lines) {
  const digits = line.match(/\d/g)

  const [first, last] = [digits[0], ...digits.slice(-1)]

  const calibrationValue = Number(`${first}${last}`) || 0

  calibrationSum += calibrationValue
}

Após solucionar a primeira parte do desafio, a segunda parte fica disponível e ela trouxe alguns desafios diferentes, visto que agora os dígitos escritos por extenso deveriam ser considerados.

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!

Como já havia resolvido a primeira parte com RegExp, decidi que tentaria buscar uma solução usando a mesma abordagem para a segunda parte.

Decidi que iria substituir os dígitos por extenso (como one ou five) pelos seus valores e reaproveitar a função usada para resolver a primeira parte. Esbarrei em uma dificuldade quando os valores por extenso se “conectavam” usando a mesma letra final do primeiro dígito e a letra inicial do segundo dígito. Para solucionar este problema, em vez de substituir apenas pelo dígito em si, usei a primeira e a última letra do dígito por extenso antes e depois do mesmo (respectivamente). Bastava então, chamar a função que fazia essa substituição de forma recursiva caso ainda houvessem valores a serem substituídos.

Alguns exemplos de linhas com esse “problema” são:

sd21eighthreeshr2
7sd8nineightlk
2twone1

Como explicado ao invés de substituir eight por 8, o valor foi substituido por e8t, permitindo que o resultado para os exemplos anteriores fiquem da seguinte forma:

sd21e8t3eshr2
7sd8n9e8tlk
2t2o1e1

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: