aoc_omni/c/2017/2/problem.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);
}