Compare commits

...

2 commits

2 changed files with 153 additions and 0 deletions

72
day_2/1.c Normal file
View file

@ -0,0 +1,72 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct levels {
size_t mem_size;
size_t size;
unsigned int *data;
} levels_t;
int main(void) {
FILE *fp = fopen("input", "r");
if (fp == NULL) {
perror("input");
return 1;
}
char *line = NULL;
size_t size;
levels_t levels;
levels.mem_size = 10;
levels.size = 0;
levels.data = malloc(sizeof(unsigned int) * levels.mem_size);
unsigned int sum = 0;
while (getline(&line, &size, fp) > 0) {
char *next = strtok(line, " ");
while (next != NULL) {
if (levels.size >= levels.mem_size) {
levels.mem_size *= 2;
levels.data =
realloc(levels.data, levels.mem_size * sizeof(unsigned int));
}
sscanf(next, "%u", &levels.data[levels.size]);
levels.size++;
next = strtok(NULL, " ");
}
bool safe = true;
int diff = levels.data[1] - levels.data[0];
int increasing = diff > 0 ? 1 : -1;
for (int i = 1; i < levels.size; i++) {
diff = increasing * (levels.data[i] - levels.data[i - 1]);
if (diff < 1 || diff > 3) {
safe = false;
break;
}
}
if (safe) {
sum++;
}
levels.size = 0;
}
free(line);
free(levels.data);
printf("%u\n", sum);
fclose(fp);
return 0;
}

81
day_2/2.c Normal file
View file

@ -0,0 +1,81 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct levels {
size_t mem_size;
size_t size;
unsigned int *data;
} levels_t;
int main(void) {
FILE *fp = fopen("example", "r");
if (fp == NULL) {
perror("input");
return 1;
}
char *line = NULL;
size_t size;
levels_t levels;
levels.mem_size = 10;
levels.size = 0;
levels.data = malloc(sizeof(unsigned int) * levels.mem_size);
unsigned int sum = 0;
while (getline(&line, &size, fp) > 0) {
char *next = strtok(line, " ");
while (next != NULL) {
if (levels.size >= levels.mem_size) {
levels.mem_size *= 2;
levels.data =
realloc(levels.data, levels.mem_size * sizeof(unsigned int));
}
sscanf(next, "%u", &levels.data[levels.size]);
levels.size++;
next = strtok(NULL, " ");
}
bool removed_node = false;
bool safe = true;
int diff = levels.data[1] - levels.data[0];
int increasing = diff > 0 ? 1 : -1;
for (int i = 1; i < levels.size; i++) {
diff = increasing * (levels.data[i] - levels.data[i - 1]);
if (diff < 1 || diff > 3) {
if (removed_node) {
safe = false;
break;
}
for (int j = i; j < levels.size; j++) {
levels.data[j - 1] = levels.data[j];
}
levels.size--;
i = 0;
removed_node = true;
}
}
if (safe) {
sum++;
}
levels.size = 0;
}
free(line);
free(levels.data);
printf("%u\n", sum);
fclose(fp);
return 0;
}