80 lines
1.7 KiB
C
80 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
|
|
#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);
|
|
}
|