#include #include int arraySize = 0; int checkNumber(int number, int **array, int last) { for (int i = 0; i < last; i++) for (int j = i + 1; j < last; j++) { if ((*array[i] + *array[j]) == number) { return 1; } } return 0; } int findNumber(int **allNumbers, int last) { int tempArray[last]; for (int i = 0; i < last; i++) tempArray[i] = *allNumbers[i]; int start = 0; int index = last; while (index < arraySize) { int number = *allNumbers[index]; if (!checkNumber(number, &allNumbers[start++], last)) return number; index++; } return -1; } int **readAllNumbers(FILE *fp) { int **allNumbers = NULL; int index = 0; while (1) { int *p = malloc(sizeof(int)); if (!p) return NULL; if (1 > fscanf(fp, "%d\n", p)) return NULL; arraySize++; int **newNumbers = realloc(allNumbers, sizeof(int*)*arraySize); if (!newNumbers) return NULL; allNumbers = newNumbers; allNumbers[index] = p; index++; if (feof(fp)) break; } return allNumbers; } int encryptionWeakness(int badNumber, int **allNumbers) { for (int i = 0; i < arraySize; i++) { int sum = *allNumbers[i]; int smallest = *allNumbers[i]; int largest = *allNumbers[i]; for (int j = i + 1; j < arraySize; j++) { sum += *allNumbers[j]; smallest = smallest < *allNumbers[j] ? smallest : *allNumbers[j]; largest = largest > *allNumbers[j] ? largest : *allNumbers[j]; if (sum == badNumber) return smallest + largest; } } return -1; } void freeAllNumbers(int **array) { for (int i = 0; i < arraySize; i++) free(array[i]); free(array); } int main(int argc, char **argv) { if (argc < 3) { puts("You need to specify path to file and preamble length!"); return -1; } int last = atoi(argv[2]); FILE *fp = fopen(argv[1], "r"); if (!fp) { puts("Can't read"); return -1; } int **allNumbers = readAllNumbers(fp); if (!allNumbers) { puts("Can't read numbers!"); fclose(fp); return -1; } int badNumber = findNumber(allNumbers, last); printf("Part1: %d\n", badNumber); printf("Part2: %d\n", encryptionWeakness(badNumber, allNumbers)); freeAllNumbers(allNumbers); fclose(fp); }