138 lines
3.1 KiB
C
138 lines
3.1 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#include "puzzle_input.h"
|
|
#include "day.h"
|
|
|
|
//#define DEBUG
|
|
|
|
#define MAX_VENT_LINES 1000
|
|
#define GRID_SIZE 1000
|
|
|
|
typedef struct {
|
|
int64_t start_x;
|
|
int64_t start_y;
|
|
int64_t end_x;
|
|
int64_t end_y;
|
|
} range_t;
|
|
|
|
parse_ret_t parse_vent_line(char * buffer, void * data, uint16_t index) {
|
|
range_t * range_data = (range_t *)data;
|
|
range_t *range = &range_data[index];
|
|
parse_ret_t res;
|
|
|
|
char * start = strtok(buffer, " -> ");
|
|
char * end = strtok(NULL, " -> ");
|
|
|
|
res = parse_long(strtok(start, ","), &range->start_x, 10);
|
|
|
|
if (res != PARSER_OK) {
|
|
return res;
|
|
}
|
|
|
|
res = parse_long(strtok(NULL, ","), &range->start_y, 10);
|
|
|
|
if (res != PARSER_OK) {
|
|
return res;
|
|
}
|
|
|
|
res = parse_long(strtok(end, ","), &range->end_x, 10);
|
|
|
|
if (res != PARSER_OK) {
|
|
return res;
|
|
}
|
|
|
|
res = parse_long(strtok(NULL, ","), &range->end_y, 10);
|
|
|
|
if (res != PARSER_OK) {
|
|
return res;
|
|
}
|
|
|
|
return PARSER_OK;
|
|
}
|
|
|
|
int day_5() {
|
|
range_t data[MAX_VENT_LINES];
|
|
uint16_t len;
|
|
uint8_t part1_grid[GRID_SIZE][GRID_SIZE] = {0};
|
|
uint8_t part2_grid[GRID_SIZE][GRID_SIZE] = {0};
|
|
|
|
parse_ret_t res = read_input_single_line("../inputs/day_5.txt", (void *)data, MAX_VENT_LINES, parse_vent_line, &len);
|
|
|
|
if (res != PARSER_OK) {
|
|
printf("Error parsing input: %d", res);
|
|
return -1;
|
|
}
|
|
|
|
for (int line_ndx = 0; line_ndx < len; line_ndx++) {
|
|
range_t * line = &data[line_ndx];
|
|
int x = (int)line->start_x;
|
|
int y = (int)line->start_y;
|
|
|
|
int x_done = 0;
|
|
int y_done = 0;
|
|
while (!x_done || !y_done) {
|
|
if (line->start_x == line->end_x || line->start_y == line->end_y) {
|
|
part1_grid[x][y]++;
|
|
}
|
|
|
|
part2_grid[x][y]++;
|
|
if (x == line->end_x) {
|
|
x_done = 1;
|
|
}
|
|
else {
|
|
if (line->start_x < line->end_x) {
|
|
x++;
|
|
}
|
|
else {
|
|
x--;
|
|
}
|
|
}
|
|
|
|
if (y == line->end_y) {
|
|
y_done = 1;
|
|
}
|
|
else {
|
|
if (line->start_y < line->end_y) {
|
|
y++;
|
|
}
|
|
else {
|
|
y--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
uint16_t danger_points_p1 = 0;
|
|
uint16_t danger_points_p2 = 0;
|
|
for (int x = 0; x < GRID_SIZE; x++) {
|
|
for (int y = 0; y < GRID_SIZE; y++) {
|
|
#ifdef DEBUG
|
|
|
|
if (part2_grid[y][x] == 0) {
|
|
printf(".");
|
|
}
|
|
else {
|
|
printf("%d", part2_grid[y][x]);
|
|
}
|
|
#endif
|
|
|
|
if (part1_grid[x][y] >= 2) {
|
|
danger_points_p1++;
|
|
}
|
|
|
|
if (part2_grid[x][y] >= 2) {
|
|
danger_points_p2++;
|
|
}
|
|
}
|
|
#ifdef DEBUG
|
|
printf("\n");
|
|
#endif
|
|
}
|
|
|
|
printf("PART 1: There are %d danger zones\n", danger_points_p1);
|
|
printf("PART 2: There are %d danger zones\n", danger_points_p2);
|
|
|
|
return 0;
|
|
} |