瀏覽代碼

[2024][c][Day_1] Adding solution for Part 1

Vinicius Teshima 1 年之前
父節點
當前提交
e04a39911b
共有 2 個文件被更改,包括 109 次插入0 次删除
  1. 1 0
      2024/c/Day_1/Makefile
  2. 108 0
      2024/c/Day_1/main.c

+ 1 - 0
2024/c/Day_1/Makefile

@@ -0,0 +1 @@
+../Makefile

+ 108 - 0
2024/c/Day_1/main.c

@@ -0,0 +1,108 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+#define IMP
+#include "../file.h"
+
+size_t cstr_char_count(const char *cstr, char c);
+int cmp_sort(const void *this, const void *other);
+
+int
+main(int argc, char *argv[])
+{
+	enum file_err ferr;
+	size_t line_num = 0;
+	size_t i = 0;
+	long res = 0;
+
+	long *left = NULL;
+	size_t left_size = 0;
+
+	long *right = NULL;
+	size_t right_size = 0;
+
+	char *raw_input = NULL;
+	size_t raw_input_size = 0;
+	raw_input = (char *) file_read_all("./input.txt", 
+					   &raw_input_size,
+					   &ferr);
+	if ( ferr != FILE_ERR_OK ) {
+		fprintf(stderr, "Failed to open file: %s\n", 
+			file_err_to_cstr(ferr));
+		exit(EXIT_FAILURE);
+	}
+
+	line_num = cstr_char_count(raw_input, '\n');
+
+	left = calloc(line_num+1, sizeof(*left));
+	right = calloc(line_num+1, sizeof(*right));
+
+	{
+	long ret = -1;
+	char *str = raw_input;
+	char *nstr = NULL;
+	long *doing = left;
+	size_t *doing_size = &left_size;
+
+	while ( true ) {
+		ret = strtol(str, &nstr, 10);
+		if ( ret == 0 ) {
+			break;
+		}
+		str = nstr;
+
+		doing[(*doing_size)++] = ret;
+
+		if ( doing == left ) {
+			doing = right;
+			doing_size = &right_size;
+		} else {
+			doing = left;
+			doing_size = &left_size;
+		}
+	}
+	}
+
+	qsort(left, left_size, sizeof(*left), cmp_sort);
+	qsort(right, right_size, sizeof(*right), cmp_sort);
+
+	if ( left_size != right_size ) {
+		printf("Sizes differ");
+		exit(EXIT_FAILURE);
+	}
+
+	for ( i = 0; i < left_size; ++i ) {
+		res += labs(left[i] - right[i]);
+	}
+
+	printf("Result: %ld\n", res);
+
+	free(left);
+	free(right);
+
+	free(raw_input);
+
+	(void) argc; (void) argv;
+	return 0;
+}
+
+size_t 
+cstr_char_count(const char *cstr, char c)
+{
+	size_t ret = 0;
+	while ( *cstr != '\0' ) {
+		ret += ( *cstr == c );
+		cstr++;
+	}
+	return ret;
+}
+
+int 
+cmp_sort(const void *this, const void *other)
+{
+	long this_ = *((long*) this);
+	long other_ = *((long*) other);
+
+	return (int) (this_ - other_);
+}