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”

Livro: Como ser um programador melhor
Livro: 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.

Site do adventofcode
Site do adventofcode

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.

Loading