aoc-2021/src/day_5.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;
}