Advent of Code 2023 Day 01: Trebuchet?!
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: