Site: Advent of Code e seus desafios

Conheci um site muito interessante por um canal no Youtube e achei válido comenta-lo por aqui. O site que mensiono é este aqui: https://adventofcode.com/2023/day/1#part2.
Ele traz uma série de desafios que culminados ao último livro estava lendo, me levaram a decidir a fazer estes desafios usando linguagens de programação que eu nunca usei antes apenas para ampliar meu conhecimento sobre a estrutura básicas destas linguagens.
E falando a respeito deste último livro que li, eu recomendo não para agora de imediado, mas sim após você já ter alguns anos de experiência na área, a leitura de “Como ser um programador melhor”

Este livro é excelente! O autor cobre sobre muitas coisas interessantes que podemos melhorar sobre nossa carreira. Uma das coisas que me chamou a antenção e meio que conceliou com o site da adventofcode foi a questão onde ele te sugere a sempre estar programando em outras linguagens para entender nem que seja o mínimo possível sobre elas. Você não precisa e nem vai se tornar um expert nela, mas saber o mínimo possível já o torna melhor do que você ficar inviesado com o seu conhecimento somente na sua linguagem de programação predominante.
Além disso, diversos outros assuntos super interessantes também são abordaos neste livro. Conforme está escrito na própria capa, o livro é para programadores que se importam com o seu código.
Então, se você passa por um período autoreflexivo com relação ao código que anda escrevendo e deseja alguma orientação, um norte sobre o que pensar referentes aos projetos que faz, este livro será uma leitura interessante.
Mas bem, vamos ao Advent of Code!
O site Advent of Code
Quando entrei no site, de cara eu já fique estasiado com o seu layout bem fora do senso comum em sites. Apesar de ser bem diferente do “padrão”. Eu me amarrei no layout.

Mas a questão aqui deste artigo é comentar sobre como você pode se divertir ao tentar resolver os desafios. E com relação ao que desejo fazer neste site é tentar resolver os problemas usando lingugens de programação que eu nunca usei ou que foram rara as vezes que utilizei.
Pensando nisso, eu decidi tentar resolver o primeiro problema usando C++.
O desafio
O primeiro desafio é um tanto simples. Minha linguagem nativa de programação sempre foi o PHP e em segundo o javascript. Mas para este problema eu decidi tentar resolver-lo em C++.
O primeiro problema é o seguinte. Dado os caracteres abaixo em cada linha:
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet
O que eu preciso fazer é pegar o primeiro dígito e o último digito que aparecer na string e formar um número. Caso a string contenha somente um único número, este número será o primeiro o último número simultâneamente.
Exemplos de resposta com relação as caracteres acima.
1° linha número: 12
2° linha número: 38
3° linha número: 15
4° linha número: 77
Após extraído estes números, eu devo soma-los para saber o resultado. Neste caso seria somar: 12+38+15+77 que resulta em 142.
No desafio, eles te passam um arquivo txt que contém umas 1000 strings dessas contendo números espalhados nestas strings. Seu objetivo é varrer esta string linha por linha e capturar os digitos corretos para só depois fazer a soma geral dos números coletados.
E aí? Está pronto para o desafio?
Link do desafio: https://adventofcode.com/2023/day/1
Eu vou deixar aqui a minha solução feita em C++. Meu objetivo é em outra oportunidade, ir explicando como consegui resolver o problema. Na verdade a solução já estava na minha cabeça desde quando entendi o que era pra ser feito. Porém, a minnha falta da habilidade com a sintax do C++, deixou a solução a alguns dias de distância de mim. Mas no final, valeu a pena, consegui resolver e além do mais, tive um pouquinho da experiência de mexer com C++.
No próximo desafio, eu irei utilizar uma outra linguagem de programação. Provavelmente será alguma linguagem antiga.
O resultado
Segue abaixo, o script em C++ do desafio.
#include<stdio.h>
#include <string.h>
#include <iostream>
int checkNumber(char caracter) {
if(caracter == '1' || caracter == '2' || caracter == '3' || caracter == '4' || caracter == '5' || caracter == '6'
|| caracter == '7' || caracter == '8' || caracter == '9') {
return 1;
} else {
return 0;
}
}
int numberCalibration(char character) {
int number = checkNumber(character);
if(number) {
return character - '0';
}
return 0;
}
int calibration(char row[100]) {
int i, j = 0;
int size = strlen(row);
int calibration_left_number = 0;
int calibration_right_number = 0;
for(i; i<=size; i++) {
int left_number = 0;
left_number = numberCalibration(row[i]);
if(left_number > 0) {
calibration_left_number = left_number;
break;
}
}
for(j=size-1; j>=0; j--) {
int right_number = numberCalibration(row[j]);
if(right_number > 0) {
calibration_right_number = right_number;
break;
}
}
return calibration_left_number * 10 + calibration_right_number;
}
int main() {
FILE *inputsFile;
char *result;
int i;
char row[100];
int total_calibration = 0;
printf("--- Day 1: Trebuchet?! ---\n");
inputsFile = fopen("inputs.txt", "rt");
if(inputsFile == NULL) {
printf("ARQUIVO NÃO ENCONTRADO!");
return 0;
}
i = 0;
while(!feof(inputsFile)) {
result = fgets(row, 100, inputsFile);
char number = calibration(row);
total_calibration += number;
printf("Valor calibrado: %d - Texto: %s", number, result);
i++;
}
printf("\n\nResultado da calibracao: %d", total_calibration);
fclose(inputsFile);
}
Termino por aqui, obrigado e até o próximo artigo.