commit 29117a3e835db21029e19364b4aa055f8b413394
parent 6aef118d598a26b339a578dd83e6dbb09366bacd
Author: bsandro <[email protected]>
Date: Mon, 6 Dec 2021 14:46:16 +0200
Day 06, puzzle 1 (bruteforce solution)
Diffstat:
5 files changed, 192 insertions(+), 0 deletions(-)
diff --git a/day06/Makefile b/day06/Makefile
@@ -0,0 +1,26 @@
+NAME=$(shell basename ${PWD})
+CC=cc
+SRC=$(wildcard *.c)
+DEPS:=$(wildcard *.h)
+OBJ:=$(SRC:.c=.o)
+
+CFLAGS=-O2 -std=c99 -Werror -Wall -Wextra -I. -I../common
+
+all: $(NAME)
+
+.PHONY: clean run
+
+clean:
+ rm -f $(OBJ) $(NAME)
+
+%.o : %.c $(DEPS)
+ $(CC) $(CFLAGS) -c $< -o $@
+
+$(NAME): $(OBJ)
+ $(CC) $(OBJ) -o $@ $(LDFLAGS)
+
+run: $(NAME)
+ ./$(NAME) input.txt
+
+test: $(NAME)
+ ./$(NAME) test.txt
diff --git a/day06/input.txt b/day06/input.txt
@@ -0,0 +1 @@
+2,1,2,1,5,1,5,1,2,2,1,1,5,1,4,4,4,3,1,2,2,3,4,1,1,5,1,1,4,2,5,5,5,1,1,4,5,4,1,1,4,2,1,4,1,2,2,5,1,1,5,1,1,3,4,4,1,2,3,1,5,5,4,1,4,1,2,1,5,1,1,1,3,4,1,1,5,1,5,1,1,5,1,1,4,3,2,4,1,4,1,5,3,3,1,5,1,3,1,1,4,1,4,5,2,3,1,1,1,1,3,1,2,1,5,1,1,5,1,1,1,1,4,1,4,3,1,5,1,1,5,4,4,2,1,4,5,1,1,3,3,1,1,4,2,5,5,2,4,1,4,5,4,5,3,1,4,1,5,2,4,5,3,1,3,2,4,5,4,4,1,5,1,5,1,2,2,1,4,1,1,4,2,2,2,4,1,1,5,3,1,1,5,4,4,1,5,1,3,1,3,2,2,1,1,4,1,4,1,2,2,1,1,3,5,1,2,1,3,1,4,5,1,3,4,1,1,1,1,4,3,3,4,5,1,1,1,1,1,2,4,5,3,4,2,1,1,1,3,3,1,4,1,1,4,2,1,5,1,1,2,3,4,2,5,1,1,1,5,1,1,4,1,2,4,1,1,2,4,3,4,2,3,1,1,2,1,5,4,2,3,5,1,2,3,1,2,2,1,4
diff --git a/day06/main.c b/day06/main.c
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <time.h>
+
+void puzzle(const char *filename, int *res1, int *res2);
+
+int main(int argc, char *argv[]) {
+ printf("Advent of Code: day 06\n");
+ double time_start = clock();
+
+ if (argc <= 0) {
+ return -1;
+ }
+ if (argc <= 1) {
+ printf("Usage: %s inputfile.txt\n", argv[0]);
+ return -1;
+ }
+
+ const char *filename = argv[1];
+
+ int counter1 = -1;
+ int counter2 = -1;
+
+ puzzle(filename, &counter1, &counter2);
+
+ printf("Puzzle #1: %d\n", counter1);
+ printf("Puzzle #2: %d\n", counter2);
+
+ double elapsed = clock() - time_start;
+ printf("Elapsed: %f\n", elapsed / CLOCKS_PER_SEC);
+
+ return 0;
+}
diff --git a/day06/puzzle.c b/day06/puzzle.c
@@ -0,0 +1,132 @@
+#define _DEFAULT_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <strings.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <time.h>
+
+#define STR_LEN 16384
+#define DAYS 80
+#define KODOMO 8
+#define OYAKO 6
+
+struct fish_t {
+ struct fish_t *next;
+ int value;
+} fish_t;
+
+struct fishes_list_t {
+ struct fish_t *first;
+ struct fish_t *last;
+ size_t size;
+};
+
+void make_fishes_list(struct fishes_list_t *fishes, const char *str);
+void print_fishes_list(struct fishes_list_t *fishes);
+void add_fish(struct fishes_list_t *fishes, int value);
+struct fish_t * new_fish(int value);
+
+/* ****************************************************************** */
+
+void puzzle(const char *filename, int *result1, int *result2) {
+ FILE *infile = fopen(filename, "r");
+ if (infile == NULL) {
+ fprintf(stderr, "fopen() error: %s\n", strerror(errno));
+ return;
+ }
+
+ char buf[STR_LEN] = {0};
+ unsigned int line_num = 0;
+
+ *result1 = 0;
+ *result2 = 0;
+
+ struct fishes_list_t fishes = { .first = NULL, .last = NULL, .size = 0};
+
+ while (fgets(buf, STR_LEN, infile) != NULL) {
+ make_fishes_list(&fishes, buf);
+
+ ++line_num;
+ bzero(buf, STR_LEN);
+ }
+
+ //printf("fishes:");
+ //print_fishes_list(&fishes);
+ struct fish_t *fish = NULL;
+
+ for (int day = 1; day <= DAYS; ++day) {
+ fish = fishes.first;
+ size_t num = 0;
+ size_t cnt = fishes.size;
+ while (fish != NULL && num < cnt) {
+ if (fish->value == 0) {
+ add_fish(&fishes, KODOMO);
+ fish->value = OYAKO;
+ } else {
+ fish->value--;
+ }
+ fish = fish->next;
+ num++;
+ }
+ //printf("day %2d: %zu\n", day, fishes.size);
+ //print_fishes_list(&fishes);
+ }
+
+ *result1 = fishes.size;
+
+ // mutiny! ignoring feof/ferror.
+ fclose(infile);
+}
+
+struct fish_t * new_fish(int value) {
+ struct fish_t *fish = malloc(sizeof(struct fish_t));
+ assert(fish != NULL);
+ fish->value = value;
+ fish->next = NULL;
+ return fish;
+}
+
+void add_fish(struct fishes_list_t *fishes, int value) {
+ struct fish_t *fish = new_fish(value);
+ if (fishes->first == NULL) {
+ fishes->first = fish;
+ }
+
+ if (fishes->last == NULL) {
+ fishes->last = fish;
+ }
+
+ fishes->last->next = fish;
+ fishes->last = fish;
+ ++fishes->size;
+}
+
+void make_fishes_list(struct fishes_list_t *fishes, const char *str) {
+ assert(fishes != NULL);
+ assert(str != NULL);
+ char *tmp = strndup(str, STR_LEN);
+ char *token = NULL;
+ assert(tmp != NULL);
+
+ while ((token = strsep(&tmp, ",")) != NULL) {
+ int val = atoi(token);
+ add_fish(fishes, val);
+ }
+
+ free(tmp);
+}
+
+void print_fishes_list(struct fishes_list_t *fishes) {
+ assert(fishes != NULL);
+ assert(fishes->first != NULL);
+ struct fish_t *fish = fishes->first;
+ while (fish != NULL) {
+ printf("%2d", fish->value);
+ fish = fish->next;
+ }
+ printf("\n");
+}
diff --git a/day06/test.txt b/day06/test.txt
@@ -0,0 +1 @@
+3,4,3,1,2