From 0ed198232976665e224a643af8119c57b1a516eb Mon Sep 17 00:00:00 2001 From: jiriks74 Date: Tue, 3 Dec 2024 04:08:49 +0100 Subject: [PATCH] feat(01): Complete day 1 Some things should be done in a better way but it's working and it's late. --- 01/CMakeLists.txt | 2 +- 01/README.md | 50 ++++++++++++++++++++++++++++ 01/src/main.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++- 01/test.input | 6 ++++ 4 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 01/test.input diff --git a/01/CMakeLists.txt b/01/CMakeLists.txt index 9d75eb2..da4a6b3 100644 --- a/01/CMakeLists.txt +++ b/01/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) # Generate compile_commands.json -set(PROJECT_NAME CTemplate) +set(PROJECT_NAME 01) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Turn on testing by default diff --git a/01/README.md b/01/README.md index 569ff04..ae8140c 100644 --- a/01/README.md +++ b/01/README.md @@ -86,3 +86,53 @@ In the example above, this is `2 + 1 + 0 + 1 + 2 + 5`, a total distance of _`11` Your actual left and right lists contain many location IDs. _What is the total distance between your lists?_ + +### Part Two + +Your analysis only confirmed what everyone feared: +the two lists of location IDs are indeed very different. + +Or are they? + +The Historians can't agree on which group made the mistakes _or_ +how to read most of the Chief's handwriting, but in the commotion you notice +an interesting detail: +a lot +of location IDs appear in both lists! +Maybe the other numbers aren't location IDs at all but rather misinterpreted handwriting. + +This time, you'll need to figure out exactly how often each number from the left +list appears in the right list. Calculate a total _similarity score_ +by adding up each number in the left list after multiplying it by the number +of times that number appears in the right list. + +Here are the same example lists again: + +``` +3 4 +4 3 +2 5 +1 3 +3 9 +3 3 +``` + +For these example lists, here is the process of finding the similarity score: + +- The first number in the left list is `3`. +It appears in the right list three times, so the similarity score increases by `3 * 3 = 9`. +- The second number in the left list is `4`. +It appears in the right list once, so the similarity score increases by `4 * 1 = 4`. +- The third number in the left list is `2`. +It does not appear in the right list, so the similarity score does not increase (`2 * 0 = 0`). +- The fourth number, `1`, +also does not appear in the right list. +- The fifth number, `3`, +appears in the right list three times; the similarity score increases by _`9`_. +- The last number, `3`, +appears in the right list three times; the similarity score again increases by _`9`_. + +So, for these example lists, the similarity score at the end of this process +is _`31`_ (`9 + 4 + 0 + 0 + 9 + 9`). + +Once again consider your left and right lists. _What is their similarity score?_ diff --git a/01/src/main.c b/01/src/main.c index 70ba1e7..165cafd 100644 --- a/01/src/main.c +++ b/01/src/main.c @@ -6,7 +6,30 @@ * @author jiriks74 */ +#define _GNU_SOURCE + #include +#include + +#define INC_CHUNK = 64 + +int compareInt(const void *a, const void *b) { + int int_a = *((int *)a); + int int_b = *((int *)b); + return int_a < int_b ? -1 : int_a == int_b ? 0 : 1; +} + +int compare(const void *a, const void *b) { + int int_a = *((int *)a); + int int_b = *((int *)b); + + if (int_a == int_b) + return 0; + else if (int_a < int_b) + return -1; + else + return 1; +} /** * @brief Main entry point @@ -20,6 +43,64 @@ int main(int argc, char *argv[]) int main_test(int argc, char *argv[]) #endif { - printf("Hello world!\n"); + + FILE *file; + if (argc == 1) { + file = stdin; + } else { + file = fopen(argv[1], "r"); + } + + if (file == NULL) { + if (argc > 1) + fprintf(stderr, "Could not open file '%s'\n", argv[1]); + else + fprintf(stderr, "Couldn't open file\n"); + exit(EXIT_FAILURE); + } + + char *buffer = NULL; + size_t bufferSize = 0; + uint lines = 0; + while (getline(&buffer, &bufferSize, file) != -1) { + lines++; + } + + int array1[lines]; + int array2[lines]; + + rewind(file); + + for (uint i = 0; i < lines; i++) { + char *buffer = NULL; + size_t bufferSize = 0; + if (getline(&buffer, &bufferSize, file) == -1) + break; + + sscanf(buffer, "%d %d", &array1[i], &array2[i]); + } + + fclose(file); + + qsort(array1, lines, sizeof(int), compareInt); + qsort(array2, lines, sizeof(int), compareInt); + + uint distanceSum = 0; + for(uint i = 0; i < lines; i++){ + distanceSum += array1[i] < array2[i] ? array2[i] - array1[i] : array1[i] - array2[i]; + } + + uint reoccuranceSum = 0; + for(uint i = 0; i < lines; i++){ + uint reoccurance = 0; + for(uint j = 0; j < lines; j++){ + if(array1[i] == array2[j]) reoccurance++; + } + reoccuranceSum += array1[i] * reoccurance; + } + + printf("The distance between my lists is %d\n", distanceSum); + printf("The simmilarity score is %d\n", reoccuranceSum); + return 0; } diff --git a/01/test.input b/01/test.input new file mode 100644 index 0000000..b8af9ad --- /dev/null +++ b/01/test.input @@ -0,0 +1,6 @@ +3 4 +4 3 +2 5 +1 3 +3 9 +3 3