Files
dobiadi 7f9333b79c Day8
2024-12-08 12:35:40 +01:00

134 lines
3.9 KiB
C

#include <stdio.h>
#include <stdlib.h>
#define MAX_DIMENSION 1024
#define MAX_ANTENNA_KINDS 128
#define MAX_ANTENNA_PER_KIND 128
typedef struct antennas {
char antenna_kind[MAX_ANTENNA_KINDS];
int antennas[MAX_ANTENNA_KINDS][MAX_ANTENNA_PER_KIND][2];
int antenna_count[MAX_ANTENNA_KINDS];
int count;
} antennas_t;
int main() {
char c;
char **map = calloc(MAX_DIMENSION, sizeof(map[0]));
int rows = 0, columns, i = 0;
map[0] = calloc(MAX_DIMENSION, sizeof(map[0][0]));
while ((c = getchar()) != EOF) {
map[rows][i] = c;
i++;
if (c != '\n') {
continue;
}
columns = i - 1;
rows++;
map[rows] = calloc(MAX_DIMENSION, sizeof(map[0][0]));
i = 0;
}
antennas_t antennas = { 0 };
for (i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
switch (map[i][j]) {
case '.':
break;
default:
{
int idx;
for (idx = 0; idx < antennas.count; idx++) {
if (antennas.antenna_kind[idx] == map[i][j]) {
break;
}
}
if (antennas.count == idx) {
antennas.count++;
}
antennas.antenna_kind[idx] = map[i][j];
antennas.antennas[idx][antennas.antenna_count[idx]][0] = i;
antennas.antennas[idx][antennas.antenna_count[idx]][1] = j;
antennas.antenna_count[idx]++;
}
break;
}
}
}
int **antinodes = calloc(rows, sizeof(antinodes[0]));
for (i = 0; i < rows; i++) {
antinodes[i] = calloc(columns, sizeof(antinodes[0][0]));
}
int **antinodes2 = calloc(rows, sizeof(antinodes2[0]));
for (i = 0; i < rows; i++) {
antinodes2[i] = calloc(columns, sizeof(antinodes2[0][0]));
}
for (i = 0; i < antennas.count; i++) {
for (int j = 0; j < antennas.antenna_count[i]; j++) {
for (int k = j + 1; k < antennas.antenna_count[i]; k++) {
int x1 = antennas.antennas[i][j][0];
int y1 = antennas.antennas[i][j][1];
int x2 = antennas.antennas[i][k][0];
int y2 = antennas.antennas[i][k][1];
int diffx = (x2 - x1);
int diffy = (y2 - y1);
for (int l = 0; 1; l++) {
int ax1 = x2 + l * diffx;
int ay1 = y2 + l * diffy;
if (!(ax1 >= 0 && ax1 < rows && ay1 >= 0 && ay1 < columns)) {
break;
}
if (l == 1) {
antinodes[ax1][ay1] = 1;
}
antinodes2[ax1][ay1] = 1;
}
for (int l = 0; 1; l++) {
int ax2 = x1 - l * diffx;
int ay2 = y1 - l * diffy;
if (!(ax2 >= 0 && ax2 < rows && ay2 >= 0 && ay2 < columns)) {
break;
}
if (l == 1) {
antinodes[ax2][ay2] = 1;
}
antinodes2[ax2][ay2] = 1;
}
}
}
}
int count = 0;
int count2 = 0;
for (i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
count += antinodes[i][j];
count2 += antinodes2[i][j];
}
}
for (i = 0; i < rows + 1; i++) {
free(antinodes[i]);
}
free(antinodes);
for (i = 0; i < rows + 1; i++) {
free(antinodes2[i]);
}
free(antinodes2);
for (i = 0; i < rows + 1; i++) {
free(map[i]);
}
free(map);
printf("%i\n", count);
printf("%i\n", count2);
}