commit d836c1292cf2a87c207c2d40388826bbf81c6195
parent 6a74421ce22aa41c12ba46eec2db98ae26163fcf
Author: bsandro <[email protected]>
Date: Sun, 19 Dec 2021 05:25:53 +0200
day18 trying to parse
Diffstat:
5 files changed, 295 insertions(+), 0 deletions(-)
diff --git a/day18/Makefile b/day18/Makefile
@@ -0,0 +1,25 @@
+NAME=$(shell basename ${PWD})
+SRC=$(wildcard *.c ../common/*.c)
+DEPS:=$(wildcard *.h ../common/*.h)
+OBJ:=$(SRC:.c=.o)
+CFLAGS=-O0 -g -std=c99 -Werror -Wall -Wextra -I. -I../common
+LDFLAGS=-lc
+
+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/day18/input.txt b/day18/input.txt
@@ -0,0 +1,100 @@
+[[[[7,2],[0,2]],9],[[[7,8],6],[0,[2,3]]]]
+[[[0,9],3],1]
+[[[[0,5],6],[[0,6],[7,8]]],[[[2,2],[1,5]],[9,5]]]
+[[2,1],[[3,1],[[3,2],9]]]
+[[[[9,3],[7,5]],[5,9]],[[0,[0,4]],2]]
+[[[9,9],4],[8,[[4,9],7]]]
+[[[1,9],[[8,3],[6,1]]],[5,1]]
+[[[[8,6],[1,3]],[3,[1,1]]],[[[6,4],[0,4]],[[0,0],3]]]
+[[[[6,4],[3,3]],[7,5]],[[6,5],[0,4]]]
+[[[[6,4],[2,3]],5],[9,[[4,4],[7,7]]]]
+[[1,[[7,9],1]],[[[8,2],5],[[7,2],8]]]
+[[[2,[7,2]],[5,3]],[1,5]]
+[[[[2,2],[1,5]],[[1,6],[0,5]]],[6,[9,[9,9]]]]
+[[7,2],[[3,8],[5,[6,7]]]]
+[[[6,5],[[8,0],1]],[2,[6,0]]]
+[[[8,7],6],[[[7,2],[7,0]],3]]
+[[[[9,1],[0,1]],[0,4]],[8,0]]
+[[[8,2],[8,[2,7]]],[[2,[2,6]],[2,[1,2]]]]
+[[[1,7],[[0,0],3]],[[3,[3,6]],[6,3]]]
+[[[[5,9],[1,2]],[0,0]],[[8,8],9]]
+[[[1,2],[4,2]],[3,4]]
+[[[9,[0,0]],[[3,5],7]],[[[8,0],[2,1]],[3,[1,5]]]]
+[[[[9,2],[7,1]],[[0,4],5]],[9,2]]
+[[3,[6,1]],2]
+[[[0,[0,6]],[4,[5,9]]],[[5,9],1]]
+[[[9,[8,3]],7],[[0,7],[[8,0],[9,2]]]]
+[[[[0,7],7],[[1,8],[4,4]]],[[0,[6,4]],[[4,9],4]]]
+[[[[3,3],3],7],4]
+[[4,[[5,6],[8,7]]],[[[7,5],2],[2,4]]]
+[[[[3,8],[3,7]],2],[[[4,4],[9,7]],4]]
+[[[9,[2,9]],0],[7,[[3,2],[3,2]]]]
+[[[7,[6,6]],[[6,0],1]],9]
+[[3,4],[[5,[9,5]],[[2,6],2]]]
+[[[[7,4],[6,8]],[1,[8,7]]],[[[2,6],[1,4]],[8,7]]]
+[[3,[[0,8],3]],[[1,8],9]]
+[[3,[5,[0,7]]],[[[2,9],[9,3]],[0,[8,8]]]]
+[[[[1,7],5],[[4,0],[7,4]]],8]
+[[[[3,4],3],4],0]
+[[[[1,3],7],[4,[8,0]]],[[[5,9],[4,8]],[8,[7,8]]]]
+[[[9,1],[[7,2],7]],[[3,0],9]]
+[[[[6,7],2],1],[[[1,1],6],[9,[3,4]]]]
+[[[3,8],[4,0]],[[6,[1,0]],[8,[8,3]]]]
+[[[9,[4,1]],8],2]
+[[[4,3],[[7,8],5]],[[[0,2],[0,5]],[[1,2],2]]]
+[[2,7],[[5,[8,5]],[[3,5],[9,9]]]]
+[6,[[[2,6],1],[[2,4],9]]]
+[[[[8,0],[1,2]],[[1,6],0]],[[0,4],[4,6]]]
+[[[[7,0],6],[8,1]],[6,3]]
+[[[8,4],[[7,7],[2,4]]],[[7,8],[4,5]]]
+[[[4,[5,6]],[[3,4],0]],4]
+[[0,6],[[6,1],[8,[9,7]]]]
+[[4,[0,6]],[5,[[3,3],[8,0]]]]
+[7,[[[8,4],4],[6,7]]]
+[[[[7,0],5],[1,[4,4]]],[[9,[0,9]],[[5,1],9]]]
+[[[[4,3],[9,1]],2],[0,[[8,8],[1,3]]]]
+[[[7,0],[0,[2,8]]],[[0,5],[[2,9],5]]]
+[[[8,8],[2,[0,2]]],[[4,5],9]]
+[[3,9],5]
+[[[[8,6],3],[[5,1],[0,5]]],[3,1]]
+[[[7,[1,8]],[3,4]],[4,[[7,9],5]]]
+[[[[4,5],[4,3]],[[6,5],[6,9]]],[[3,[7,5]],[8,[2,9]]]]
+[[5,0],[[[2,9],1],[[0,6],6]]]
+[[4,[8,[3,0]]],[[[9,6],[1,9]],[[1,6],[8,0]]]]
+[[[[8,7],[5,9]],[[2,1],[3,4]]],[5,9]]
+[[[3,3],[2,8]],[[[1,2],9],[3,2]]]
+[[[[0,1],5],[[0,6],[9,3]]],[5,[[5,8],5]]]
+[[[5,6],[4,5]],[[7,[2,7]],[[3,1],[0,4]]]]
+[7,[[6,2],[[7,3],6]]]
+[[[5,3],[5,7]],6]
+[1,[[[6,4],[8,1]],[5,[7,5]]]]
+[[[3,6],[[7,5],7]],[[4,[4,6]],[6,4]]]
+[[[6,3],4],5]
+[[[0,9],[9,[0,1]]],[0,[4,9]]]
+[[[1,0],0],[[1,4],[9,6]]]
+[[[1,[8,0]],[[9,4],[2,0]]],[4,[[6,2],3]]]
+[[[[6,0],[5,1]],2],[[[9,6],[5,1]],7]]
+[[[9,[3,1]],[8,1]],[[6,[0,9]],[[7,1],4]]]
+[[[9,2],[4,[5,3]]],[[[7,1],[2,0]],[3,[2,2]]]]
+[[[3,[7,0]],1],[6,[[9,6],[4,4]]]]
+[[2,9],[6,[7,3]]]
+[1,[[7,[1,9]],5]]
+[[[5,3],[[1,5],[7,8]]],[[[5,3],[6,8]],[1,[5,0]]]]
+[[[1,[7,4]],[3,8]],[1,[4,[6,3]]]]
+[[[3,[8,9]],7],[[[3,4],3],[6,[3,6]]]]
+[[[3,[1,7]],[3,[1,8]]],[[[6,4],[6,4]],[[8,6],[3,4]]]]
+[[4,6],[[6,[8,4]],6]]
+[[[2,[7,7]],[[1,0],[6,6]]],[[[8,0],[1,6]],[[0,5],9]]]
+[[[[3,0],[2,1]],[4,7]],3]
+[[[[1,7],2],[[8,3],[8,9]]],[[0,4],[[6,4],2]]]
+[[[[3,6],9],[0,[6,0]]],[7,8]]
+[3,[[7,8],9]]
+[[1,[[7,9],[1,2]]],[2,9]]
+[[[3,[3,0]],4],[[1,[5,9]],[[9,6],5]]]
+[[1,[3,4]],[[8,[2,3]],3]]
+[[[8,0],8],[[[1,9],3],[[0,1],[8,6]]]]
+[[[[4,1],[3,7]],[[6,2],[5,8]]],[[[4,0],[2,4]],[4,7]]]
+[[[[9,0],[5,8]],3],2]
+[7,[[[1,0],[9,7]],[[8,3],0]]]
+[[[0,1],[4,[4,5]]],[9,[[3,6],[6,8]]]]
+[8,[[7,[4,7]],[[0,5],3]]]
diff --git a/day18/main.c b/day18/main.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+
+void puzzle(const char *filename, long long *res1, long long *res2);
+
+int main(int argc, char *argv[]) {
+ printf("Advent of Code: day 18\n");
+ double time_start = clock();
+
+ if (argc <= 1) {
+ printf("Usage: %s inputfile.txt\n", argv[0]);
+ return -1;
+ }
+
+ const char *filename = argv[1];
+ long long counter1 = -1;
+ long long counter2 = -1;
+
+ puzzle(filename, &counter1, &counter2);
+
+ printf("Puzzle #1: %lld\n", counter1);
+ printf("Puzzle #2: %lld\n", counter2);
+
+ double elapsed = clock() - time_start;
+ printf("Elapsed: %f\n", elapsed / CLOCKS_PER_SEC);
+
+ return 0;
+}
diff --git a/day18/puzzle.c b/day18/puzzle.c
@@ -0,0 +1,131 @@
+#define _DEFAULT_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <strings.h>
+#include <assert.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+#include "util.h"
+
+#define STR_LEN 1024
+
+struct pair_t {
+ int *left;
+ int *right;
+ struct pair_t *pleft;
+ struct pair_t *pright;
+ int **leftmost;
+ int **rightmost;
+ struct pair_t *parent;
+};
+
+size_t make_pair(const char *str, struct pair_t *parent, struct pair_t **pair_ptr);
+void print_pair(struct pair_t *pair);
+
+void puzzle(const char *filename, long long *result1, long long *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 array_t pairs = { .data = NULL };
+ array_init(&pairs, sizeof(void *), 10);
+
+ while (fgets(buf, STR_LEN, infile) != NULL) {
+ size_t len = strlen(buf);
+ assert(len != 0);
+ struct pair_t *pair = NULL;
+ size_t processed = make_pair(buf, NULL, &pair);
+ printf("len:%zu, processed:%zu\n", len, processed);
+ if (pairs.count >= pairs.cap) array_expand(&pairs);
+ ((struct pair_t **)pairs.data)[pairs.count++] = pair;
+
+ printf("str: %s", buf);
+ printf("pair: ");
+ print_pair(pair);
+ printf("\n");
+
+ break;
+ ++line_num;
+ bzero(buf, STR_LEN);
+ }
+
+ // mutiny! ignoring feof/ferror.
+ fclose(infile);
+}
+
+size_t make_pair(const char *str, struct pair_t *parent, struct pair_t **pair_ptr) {
+ printf("pair start\n");
+
+ assert(str != NULL);
+ struct pair_t *pair = malloc(sizeof(struct pair_t));
+ bzero(pair, sizeof(struct pair_t));
+ printf("pair_ptr: %p, *pair_ptr: %p\n", pair_ptr, *pair_ptr);
+ *pair_ptr = pair;
+
+ pair->parent = parent;
+ if (parent != NULL) {
+ pair->leftmost = parent->leftmost;
+ pair->rightmost = parent->rightmost;
+ }
+
+ assert(str[0] == '[');
+ size_t processed = 1;
+
+ if (str[processed] == '[') {
+ printf("making left pair...\n");
+ processed += make_pair(str+processed, pair, &pair->pleft);
+ } else if (str[processed] >= '0' && str[processed] <= '9') {
+ pair->left = malloc(sizeof(int));
+ *pair->left = str[processed] - '0';
+ pair->leftmost = &pair->left;
+ printf("left num %d\n", *pair->left);
+ }
+
+ processed++;
+ assert(str[processed] == ',');
+ processed++;
+
+ if (str[processed] == '[') {
+ printf("making right pair...\n");
+ processed += make_pair(str+processed, pair, &pair->pright);
+ } else if (str[processed] >= '0' && str[processed] <= '9') {
+ pair->right = malloc(sizeof(int));
+ *pair->right = str[processed] - '0';
+ pair->rightmost = &pair->right;
+ printf("right num %d\n", *pair->right);
+ }
+
+ processed++;
+ assert(str[processed] == ']');
+ printf("pair end\n");
+
+ return processed;
+}
+
+void print_pair(struct pair_t *pair) {
+ printf("[");
+ if (pair->pleft != NULL) {
+ print_pair(pair->pleft);
+ } else {
+ printf("%d", *pair->left);
+ }
+ printf(",");
+ if (pair->pright != NULL) {
+ print_pair(pair->pright);
+ } else {
+ printf("%d", *pair->right);
+ }
+ printf("]");
+}
diff --git a/day18/test.txt b/day18/test.txt
@@ -0,0 +1,10 @@
+[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
+[[[5,[2,8]],4],[5,[[9,9],0]]]
+[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
+[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
+[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
+[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
+[[[[5,4],[7,7]],8],[[8,3],8]]
+[[9,3],[[9,9],[6,[4,9]]]]
+[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
+[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]