From 5baa39a86694c4901e3ebf39d515471ddb175821 Mon Sep 17 00:00:00 2001 From: talksik Date: Fri, 1 Dec 2023 21:33:46 -0800 Subject: [PATCH] day one in raw C --- day-1/Makefile | 7 + day-1/bin/main | Bin 0 -> 34408 bytes day-1/src/input.txt | 1000 +++++++++++++++++++++++++++++++++++++++++++ day-1/src/main.c | 229 ++++++++++ 4 files changed, 1236 insertions(+) create mode 100644 day-1/Makefile create mode 100755 day-1/bin/main create mode 100644 day-1/src/input.txt create mode 100644 day-1/src/main.c diff --git a/day-1/Makefile b/day-1/Makefile new file mode 100644 index 0000000..bddd2c3 --- /dev/null +++ b/day-1/Makefile @@ -0,0 +1,7 @@ +.PHONY: all + +all: + mkdir -p ./bin + gcc ./src/main.c -o ./bin/main + ./bin/main + diff --git a/day-1/bin/main b/day-1/bin/main new file mode 100755 index 0000000000000000000000000000000000000000..7e3804756d2e9fb421b440c55f8644e51b206298 GIT binary patch literal 34408 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 dCX5gMzUfc1DKdd}`rt8z1 zg14Sn|H6(Z_XYa@vUlyNV_*HAEqnZ(>sRG{`-+R%|8L7@+%xU +#include +#include + +const char *read_input() { + char *file_name = "./src/input.txt"; + + FILE *fileptr; + + fileptr = fopen(file_name, "r"); + + if (fileptr) { + // read entire file into a buffer on heap + char *buffer = 0; + long length; + fseek(fileptr, 0, SEEK_END); + length = ftell(fileptr); + fseek(fileptr, 0, SEEK_SET); + buffer = malloc(length); + if (buffer) { + fread(buffer, 1, length, fileptr); + } + fclose(fileptr); + + return buffer; + } else { + printf("not able to open file"); + } + + fclose(fileptr); + + return ""; +} + +// given lines of text, combine first and last number of each line and sum all +// of those combined numbers +int getSum(const char text[]) { + // get one line at a time + char *curr_line = strtok(text, "\n"); + + int total = 0; + + while (curr_line != NULL) { + // printf("curr_line: %s\n", curr_line); + + int first_num = 0; + int last_num = 0; + + for (int i = 0; i < strlen(curr_line); i++) { + char curr_char = curr_line[i]; + if (curr_char >= '0' && curr_char <= '9') { + first_num = curr_char - '0'; + break; + } + } + for (int i = strlen(curr_line) - 1; i >= 0; i--) { + char curr_char = curr_line[i]; + if (curr_char >= '0' && curr_char <= '9') { + last_num = curr_char - '0'; + break; + } + } + + // printf("first: %d\n", first_num); + // printf("last: %d\n", last_num); + + // combine 1 and 9 to 19 + int combined; + if (first_num > 0 && last_num > 0) { + combined = first_num * 10 + last_num; + } else { + combined = first_num + last_num; + } + + // printf("combined: %d\n", combined); + total += combined; + + curr_line = strtok(NULL, "\n"); + } + + return total; +} + +// helper: return number if the given string contains a number +int check_if_string_contains(char *substr) { + if (strstr(substr, "one") != NULL) { + return 1; + } + if (strstr(substr, "two") != NULL) { + return 2; + } + if (strstr(substr, "three") != NULL) { + return 3; + } + if (strstr(substr, "four") != NULL) { + return 4; + } + if (strstr(substr, "five") != NULL) { + return 5; + } + if (strstr(substr, "six") != NULL) { + return 6; + } + if (strstr(substr, "seven") != NULL) { + return 7; + } + if (strstr(substr, "eight") != NULL) { + return 8; + } + if (strstr(substr, "nine") != NULL) { + return 9; + } + + return 0; +} + +int get_sum_part_two(char *text) { + // get one line at a time + char *curr_line = strtok(text, "\n"); + + int total = 0; + + while (curr_line != NULL) { + // printf("curr_line: %s\n", curr_line); + + int first_num = 0; + int last_num = 0; + + for (int i = 0; i < strlen(curr_line); i++) { + char curr_char = curr_line[i]; + if (curr_char >= '0' && curr_char <= '9') { + first_num = curr_char - '0'; + break; + } + char substr[i + 1]; + strncpy(substr, curr_line, i + 1); + substr[i + 1] = '\0'; + // printf("substr: %s\n", substr); + int num = check_if_string_contains(substr); + if (num > 0) { + first_num = num; + break; + } + } + for (int i = strlen(curr_line) - 1; i >= 0; i--) { + char curr_char = curr_line[i]; + if (curr_char >= '0' && curr_char <= '9') { + last_num = curr_char - '0'; + break; + } + + int len = strlen(curr_line) - i; + char substr[len]; + strncpy(substr, curr_line + i, len); + substr[len] = '\0'; + // printf("ending substr: %s\n", substr); + int num = check_if_string_contains(substr); + if (num > 0) { + // printf("found num: %d\n", num); + last_num = num; + break; + } + } + + // printf("first: %d\n", first_num); + // printf("last: %d\n", last_num); + + // combine 1 and 9 to 19 + int combined; + if (first_num > 0 && last_num > 0) { + combined = first_num * 10 + last_num; + } else { + combined = first_num + last_num; + } + + // printf("combined: %d\n", combined); + total += combined; + + curr_line = strtok(NULL, "\n"); + } + + return total; +} + +// returns 1 if test passes, 0 if test fails +int test() { + char test_input[] = "1abc2\npqr3stu8vwx\na1b2c3d4e5f\ntreb7uchet"; + int total = getSum(test_input); + + if (total == 142) { + return 1; + } else { + return 0; + } +} + +int test_part_two() { + char test_input[] = "two1nine\neightwothree\nabcone2threexyz\nxtwone3four\n4n" + "ineeightseven2\nzoneight234\n7pqrstsixteen"; + int total = get_sum_part_two(test_input); + return total == 281; +} + +int main() { + printf("Hello, world!\n"); + + printf("running test"); + int test_result = test(); + printf("test result: %d\n", test_result); + + printf("reading input"); + const char *input = read_input(); + // printf("input: %s\n", input); + + int result = getSum(input); + printf("result: %d\n", result); + + printf("running test part two"); + int test_result_part_two = test_part_two(); + printf("test result part two: %d\n", test_result_part_two); + + + const char* input_part_two = read_input(); + int result_part_two = get_sum_part_two(input_part_two); + printf("result part two: %d\n", result_part_two); + + return 0; +}