#include #include #include #include #include "../../lib/aoc.h" int line_checksum_1(char *line) { char **saveptr = malloc(sizeof(char*)); char *token = strtok_r(line, "\t", saveptr); int min = INT_MAX; int max = INT_MIN; while (token != NULL) { int value = atoi(token); if (value < min) min = value; if (value > max) max = value; token = strtok_r(NULL, "\t", saveptr); } free(saveptr); return max - min; } int line_checksum_2(char *line) { int tokens[20]; char **saveptr = malloc(sizeof(char*)); char *token = strtok_r(line, "\t", saveptr); int index = 0; while (token != NULL) { tokens[index++] = atoi(token); token = strtok_r(NULL, "\t", saveptr); } for (int i = 0; i < index; i++) { for (int j = 0; j < index; j++) { if (tokens[i] != tokens[j] && (tokens[i] % tokens[j] == 0)) { free(saveptr); return tokens[i] / tokens[j]; } } } for (int i = 0; i < index; i++) { printf("%d ", tokens[i]); } printf("ERROR! No checksum found\n"); return 0; } int main() { char *input = aoc_read_input(); char **line_saveptr = malloc(sizeof(char*)); char *line = strtok_r(input, "\n", line_saveptr); int checksum_sum_1 = 0; int checksum_sum_2 = 0; while (line != NULL) { char *line_copy = malloc(strlen(line) + 1); strcpy(line_copy, line); checksum_sum_1 += line_checksum_1(line); checksum_sum_2 += line_checksum_2(line_copy); line = strtok_r(NULL, "\n", line_saveptr); free(line_copy); } printf("Part 1: %d\n", checksum_sum_1); printf("Part 2: %d\n", checksum_sum_2); free(line_saveptr); free(line); free(input); }