schrockwell
/aoc2024
/amendments
/1
Day 1 solution and example input
schrockwell made amendment 1 10 months ago
--- 01-example.txt	Mon Dec  1 14:32:38 1924
+++ 01-example.txt	Mon Dec  1 14:32:38 1924
@@ -0,0 +1 @@
+3   4
4   3
2   5
1   3
3   9
3   3
--- day1.c	Mon Dec  8 18:57:33 1924
+++ day1.c	Mon Dec  8 18:57:33 1924
@@ -0,0 +1,134 @@
+#include <console.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+// CONSTANTS
+
+#define MAX_LINE_LENGTH 32
+#define MAX_LIST_SIZE 1024
+
+// TYPES
+
+typedef struct {
+	long int key;
+	int value;
+} kv;
+
+// GLOBALS
+
+long int firstList[MAX_LIST_SIZE];
+long int secondList[MAX_LIST_SIZE];
+
+kv secondHist[MAX_LIST_SIZE];
+
+// FUNCTIONS
+
+int compare_longs(const void *a, const void *b) {
+	long int int_a = *(const long int *)a;
+	long int int_b = *(const long int *)b;
+	
+	if (int_a < int_b) return -1;
+	if (int_a > int_b) return 1;
+	return 0;
+}
+
+int build_histogram(kv hist[], long int arr[], int count) {
+	int i = 0;
+	int keyCount = 0;
+	
+	for (i = 0; i < count; i++) {
+		long int key = arr[i];
+		int histIndex = findHistIndex(hist, keyCount, key);
+		
+		if (histIndex == -1) {
+			histIndex = keyCount;
+			keyCount++;
+		}
+		
+		hist[histIndex].key = key;
+		hist[histIndex].value++;
+	}
+	
+	return keyCount;
+}
+
+int findHistIndex(kv hist[], int count, long int key) {
+	int i = 0;
+	
+	for (i = 0; i < count; i++) {
+		if (hist[i].key == key) {
+			return i;
+		}
+	}
+	
+	return -1;
+}
+	
+void main(int argc, char* argv) {
+	//char *filename = "01-input.txt";
+	char *filename = "01-example.txt";
+
+	int index = 0;
+	long int firstAnswer = 0;
+	long int secondAnswer = 0;
+	int i = 0;
+	int histCount, histIndex;
+	
+	FILE *file;
+	char line[MAX_LINE_LENGTH];
+	
+	file = fopen(filename, "r");
+	if (file == NULL) {
+		perror("Error opening file");
+		return;
+	}
+	
+	printf("Reading %s... ", filename);
+	
+	while (fgets(line, sizeof(line), file) != NULL) {
+		long int num1, num2;
+		if (sscanf(line, "%ld %ld", &num1, &num2) != 2) {
+			printf("error parsing line %d", index);
+			return;
+		}
+		
+		firstList[index] = num1;
+		secondList[index] = num2;
+		index++;
+	}
+	
+	fclose(file);
+	
+	printf("read %d lines\n", index);
+	
+	// PART 1
+	
+	printf("Sorting first list...\n");
+	qsort(firstList, index, sizeof(long int), compare_longs);
+	
+	printf("Sorting second list...\n");
+	qsort(secondList, index, sizeof(long int), compare_longs);
+	
+	for (i = 0; i < index; i++) {
+		firstAnswer = firstAnswer + abs(firstList[i] - secondList[i]);
+	}
+	
+	// PART 2
+	
+	printf("Calculating histogram...\n");
+	histCount = build_histogram(secondHist, secondList, index);
+	
+	//for (i = 0; i < histCount; i++) {
+	//	printf("%ld => %d\n", secondHist[i].key, secondHist[i].value);
+	//}
+	
+	for (i = 0; i < index; i++) {
+		histIndex = findHistIndex(secondHist, histCount, firstList[i]);
+		if (histIndex == -1) continue;
+		
+		secondAnswer += firstList[i] * secondHist[histIndex].value;
+	}
+	
+	printf("Part 1: %ld\n", firstAnswer);
+	printf("Part 2: %ld\n", secondAnswer);
+}