#include #include #include #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; }