diff options
| author | Vincent Douillet <vincent@vdouillet.fr> | 2021-12-02 22:46:01 +0100 | 
|---|---|---|
| committer | Vincent Douillet <vincent@vdouillet.fr> | 2021-12-02 22:46:01 +0100 | 
| commit | c851f16d1df21d7579af72d842521b951261b092 (patch) | |
| tree | 2f1c4672b53afb8c575ff7c64d88b9020034219d | |
day 1 & 2
| -rw-r--r-- | .gitignore | 4 | ||||
| -rw-r--r-- | 011.c | 32 | ||||
| -rw-r--r-- | 012.c | 39 | ||||
| -rw-r--r-- | 021.c | 67 | ||||
| -rw-r--r-- | 022.c | 69 | ||||
| -rw-r--r-- | Makefile | 24 | ||||
| -rw-r--r-- | input.c | 55 | ||||
| -rw-r--r-- | input.h | 7 | 
8 files changed, 297 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..54be510 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +??? +*.o +input/ +*.swp @@ -0,0 +1,32 @@ +#include <stdlib.h> +#include <stdio.h> +#include "input.h" + +#define INPUT "input/01.txt" + +int main() { +	// lecture du fichier d'entree +	FILE* file=fopen(INPUT,"r"); +	if(file == NULL) { +		printf("Le fichier %s n'existe pas\n", INPUT); +		return -1; +	} +	size_t lineCount = count_lines(file); +	int* input = malloc(lineCount * sizeof(int)); +	if(read_lines_as_int(file, input, lineCount) != 0) { +		printf("Erreur de parsing du fichier\n"); +		return -1; +	} +	// fermeture du fichier +	fclose(file); + +	// calcul des variations de profondeur +	int result = 0; +	for(size_t i = 1; i < lineCount; i++) { +		if(input[i] > input[i-1]) +			result++; +	} +	printf("%d\n", result); + +	return 0; +} @@ -0,0 +1,39 @@ +#include <stdlib.h> +#include <stdio.h> +#include "input.h" + +#define INPUT "input/01.txt" + +int main() { +	// lecture du fichier d'entree +	FILE* file=fopen(INPUT,"r"); +	if(file == NULL) { +		printf("Le fichier %s n'existe pas\n", INPUT); +		return -1; +	} +	size_t lineCount = count_lines(file); +	int* input = malloc(lineCount * sizeof(int)); +	if(read_lines_as_int(file, input, lineCount) != 0) { +		printf("Erreur de parsing du fichier\n"); +		return -1; +	} +	// fermeture du fichier +	fclose(file); + +	// calcul des variations de profondeur +	int result = 0; +	int windowSum = input[0] + input[1] + input[2]; +	for(size_t i = 1; i < lineCount - 2; i++) { +		int newWindowSum = input[i] + input[i+1] + input[i+2]; +		if(newWindowSum > windowSum) +			result++; + +		windowSum = newWindowSum; +	} +	printf("%d\n", result); + +	// nettoyage +	free(input); + +	return 0; +} @@ -0,0 +1,67 @@ +#include <stdlib.h> +#include <stdio.h> +#include <err.h> +#include <string.h> +#include "input.h" + +#define INPUT "input/02.txt" + +enum direction { forward, up, down }; + +struct submarine_move { +	enum direction dir; +	int length; +}; + +void parse_move(char* string, struct submarine_move* move) { +	if(*string == 'f') +		move->dir = forward; +	else if(*string == 'u') +		move->dir = up; +	else if(*string == 'd') +		move->dir = down; +	else +		err(1, "direction inconnue %c", *string); + +	size_t stringLength = strlen(string); +	char digit = string[stringLength - 2]; +	if(digit < '0' || digit > '9') +		err(1, "longueur inconnue %c", digit); +	move->length = digit - '0'; +} + +int main() { +	// lecture du fichier d'entree +	FILE* file=fopen(INPUT,"r"); +	if(file == NULL) +		err(1, "Le fichier %s n'existe pas\n", INPUT); +	 +	size_t lineCount = count_lines(file); +	char** input = malloc(lineCount * sizeof(char*)); +	read_lines_as_string(file, input, lineCount); +	// fermeture du fichier +	fclose(file); + +	// l'algo +	struct submarine_move currentMove; +	long forwardDst = 0; +	long downDst = 0; +	for(size_t i = 0; i < lineCount; i++) { +		parse_move(input[i], ¤tMove); +		switch(currentMove.dir) { +			case forward: +				forwardDst += currentMove.length; +				continue; +			case up: +				downDst -= currentMove.length; +				continue; +			case down: +				downDst += currentMove.length; +				continue; +		} +	} +	printf("%ld\n", forwardDst * downDst); + +	free_strings(input, lineCount); +	return 0; +} @@ -0,0 +1,69 @@ +#include <stdlib.h> +#include <stdio.h> +#include <err.h> +#include <string.h> +#include "input.h" + +#define INPUT "input/02.txt" + +enum direction { forward, up, down }; + +struct submarine_move { +	enum direction dir; +	int length; +}; + +void parse_move(char* string, struct submarine_move* move) { +	if(*string == 'f') +		move->dir = forward; +	else if(*string == 'u') +		move->dir = up; +	else if(*string == 'd') +		move->dir = down; +	else +		err(1, "direction inconnue %c", *string); + +	size_t stringLength = strlen(string); +	char digit = string[stringLength - 2]; +	if(digit < '0' || digit > '9') +		err(1, "longueur inconnue %c", digit); +	move->length = digit - '0'; +} + +int main() { +	// lecture du fichier d'entree +	FILE* file=fopen(INPUT,"r"); +	if(file == NULL) +		err(1, "Le fichier %s n'existe pas\n", INPUT); +	 +	size_t lineCount = count_lines(file); +	char** input = malloc(lineCount * sizeof(char*)); +	read_lines_as_string(file, input, lineCount); +	// fermeture du fichier +	fclose(file); + +	// l'algo +	struct submarine_move currentMove; +	long forwardDst = 0; +	long downDst = 0; +	long aim = 0; +	for(size_t i = 0; i < lineCount; i++) { +		parse_move(input[i], ¤tMove); +		switch(currentMove.dir) { +			case forward: +				forwardDst += currentMove.length; +				downDst += currentMove.length * aim; +				continue; +			case up: +				aim -= currentMove.length; +				continue; +			case down: +				aim += currentMove.length; +				continue; +		} +	} +	printf("%ld\n", forwardDst * downDst); + +	free_strings(input, lineCount); +	return 0; +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1a2b7e9 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +CC=cc +CFLAGS=-std=c1x -W -Wall -g +LDFLAGS= +EXEC=011 012 021 022 + +all: $(EXEC) + +011: input.o 011.o +	$(CC) -o $@ $> $(LDFLAGS) + +012: input.o 012.o +	$(CC) -o $@ $> $(LDFLAGS) + +021: input.o 021.o +	$(CC) -o $@ $> $(LDFLAGS) + +022: input.o 022.o +	$(CC) -o $@ $> $(LDFLAGS) + +.c.o: +	$(CC) -o $@ -c $< $(CFLAGS) + +clean: +	rm -rf *.o $(EXEC) @@ -0,0 +1,55 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <err.h> + +/*public*/size_t count_lines(FILE* file) { +	size_t lineCount = 0; +	char currentChar; +	// on part du debut +	// TODO verifier le code de retour +	fseek(file, 0, SEEK_SET); +	while((currentChar=fgetc(file)) != EOF) { +		if(currentChar == '\n') +			lineCount++; +	} +	return lineCount; +} + +/*public*/int read_lines_as_int(FILE* file, int* result, int resultSize) { +	// retour au debut du fichier et lecture des lignes +	// TODO verifier le code de retour +	fseek(file, 0, SEEK_SET); +	int current; +	for(int lineIndex = 0; lineIndex < resultSize; lineIndex++) { +		if(fscanf(file, "%d", ¤t) != 1) { +			result[lineIndex] = 0; +			printf("Erreur de lecture ligne %d\n", lineIndex); +			continue; +		} +		result[lineIndex] = current; +	} + +	return 0; +} + +/*public*/int read_lines_as_string(FILE* file, char** result, int resultSize) { +	// retour au debut du fichier et lecture des lignes +	// TODO verifier le code de retour +	fseek(file, 0, SEEK_SET); +	size_t lineSize = 0; +	for(int lineIndex = 0; lineIndex < resultSize; lineIndex++) { +		char** dst = &result[lineIndex]; +		if(getline(dst, &lineSize, file) < 0) +			err(1, "Erreur de lecture ligne %d\n", lineIndex); +	} + +	return 0; +} + +/*public*/void free_strings(char** strings, size_t stringCount) { +	for(size_t i = 0; i < stringCount; i++) { +		free(strings[i]); +	} +	free(strings); +} @@ -0,0 +1,7 @@ +size_t count_lines(FILE* file); + +int read_lines_as_int(FILE* file, int* result, int resultSize); + +int read_lines_as_string(FILE* file, char** result, int resultSize); + +void free_strings(char** strings, size_t stringCount);  | 
