day 2, part 2 working!
This commit is contained in:
parent
4bcf49b54c
commit
1782eec64f
1 changed files with 123 additions and 0 deletions
123
day_8/2.c
Normal file
123
day_8/2.c
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define GRID_SIZE 50
|
||||||
|
|
||||||
|
typedef struct point {
|
||||||
|
int x, y;
|
||||||
|
} point_t;
|
||||||
|
|
||||||
|
typedef struct lots_of_points {
|
||||||
|
point_t points[4];
|
||||||
|
unsigned char index;
|
||||||
|
} lots_of_points_t;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
FILE *fp = fopen("input", "r");
|
||||||
|
|
||||||
|
if (fp == NULL) {
|
||||||
|
perror("input");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char antinodes[GRID_SIZE][GRID_SIZE] = {0};
|
||||||
|
|
||||||
|
lots_of_points_t data['z' + 1] = {0};
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < GRID_SIZE; i++) {
|
||||||
|
unsigned char buffer[GRID_SIZE] = {0};
|
||||||
|
size_t read = fread(&buffer, sizeof(char), GRID_SIZE, fp);
|
||||||
|
|
||||||
|
if (read == 0) {
|
||||||
|
fprintf(stderr, "oopsy daisy\n");
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// move past the newline
|
||||||
|
fseek(fp, 1, SEEK_CUR);
|
||||||
|
|
||||||
|
for (unsigned int j = 0; j < GRID_SIZE; j++) {
|
||||||
|
const unsigned char freq = buffer[j];
|
||||||
|
if (freq != '.') {
|
||||||
|
const point_t point = {(int)j, (int)i};
|
||||||
|
data[freq].points[data[freq].index] = point;
|
||||||
|
data[freq].index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int sum = 0;
|
||||||
|
for (unsigned int i = 0; i < 'z' + 1; i++) {
|
||||||
|
if (data[i].index == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int j = 0; j < data[i].index; j++) {
|
||||||
|
const point_t point = data[i].points[j];
|
||||||
|
for (unsigned int k = 0; k < data[i].index; k++) {
|
||||||
|
if (j == k) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const point_t other_point = data[i].points[k];
|
||||||
|
|
||||||
|
for (int l = 0;; l++) {
|
||||||
|
const int dist_x = point.x - other_point.x;
|
||||||
|
const int dist_y = point.y - other_point.y;
|
||||||
|
|
||||||
|
const point_t antinode = {point.x + dist_x * l, point.y + dist_y * l};
|
||||||
|
|
||||||
|
if (antinode.x >= GRID_SIZE || antinode.x < 0 ||
|
||||||
|
antinode.y >= GRID_SIZE || antinode.y < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (antinodes[antinode.y][antinode.x] == 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
antinodes[antinode.y][antinode.x] = 1;
|
||||||
|
|
||||||
|
sum++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
for (unsigned int i = 0; i < GRID_SIZE; i++) {
|
||||||
|
for (unsigned int j = 0; j < GRID_SIZE; j++) {
|
||||||
|
unsigned char found_freq = 0;
|
||||||
|
for (unsigned int k = 0; k < 'z' + 1; k++) {
|
||||||
|
for (unsigned int l = 0; l < data[k].index; l++) {
|
||||||
|
if (data[k].points[l].x == j && data[k].points[l].y == i) {
|
||||||
|
printf("%c", k);
|
||||||
|
found_freq = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found_freq) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found_freq) {
|
||||||
|
if (antinodes[i][j] == 1) {
|
||||||
|
printf("#");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
printf(".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf("%u\n", sum);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue