#include #include #include #include void turn_on(float grid[1000][1000], uint16_t x, uint16_t y) { grid[x][y] += 1; } void turn_off(float grid[1000][1000], uint16_t x, uint16_t y) { if (grid[x][y] > 0) grid[x][y] -= 1; } void toggle(float grid[1000][1000], uint16_t x, uint16_t y) { grid[x][y] += 2; } void process_instruction(char *line_buffer, char *delimiters, float grid[1000][1000], void (*operation)(float grid[1000][1000], uint16_t, uint16_t)) { uint16_t x1, x2, y1, y2; char *token; token = strtok(NULL, delimiters); x1 = atoi(token); token = strtok(NULL, delimiters); y1 = atoi(token); token = strtok(NULL, delimiters); //ignore the word "through" token = strtok(NULL, delimiters); x2 = atoi(token); token = strtok(NULL, delimiters); y2 = atoi(token); for (uint16_t x = x1; x <= x2; x++) for (uint16_t y = y1; y <= y2; y++) operation(grid, x, y); } int main() { FILE *file = fopen("input", "r"); if (file == NULL) { perror("Error opening file."); return 1; } float grid[1000][1000] = {0}; char delimiters[] = " ,"; char *token; char line_buffer[256]; while (fgets(line_buffer, sizeof(line_buffer), file) != NULL) { token = strtok(line_buffer, delimiters); if (!strcmp(token, "toggle")) { process_instruction(line_buffer, delimiters, grid, toggle); continue; } if (!strcmp(token, "turn")) { token = strtok(NULL, delimiters); if (!strcmp(token, "on")) { process_instruction(line_buffer, delimiters, grid, turn_on); continue; } if (!strcmp(token, "off")) { process_instruction(line_buffer, delimiters, grid, turn_off); continue; } } } if (ferror(file)) { perror("main: Error reading from file."); return 1; } fclose(file); uint32_t brightness = 0; for (uint16_t x = 0; x <= 999; x++) for (uint16_t y = 0; y <= 999; y++) brightness += grid[x][y]; printf("brightness: %u\n", brightness); return 0; }