day19: tentatively get 3 common beacons between overlapping scanners

This commit is contained in:
2022-01-14 20:26:22 +01:00
parent f1dc062250
commit a03cc1c1c4

View File

@@ -50,6 +50,7 @@ typedef struct scanner {
int nbeacons, ndists; int nbeacons, ndists;
beacon_t beacons[MAX_BEACONS]; beacon_t beacons[MAX_BEACONS];
dist_t dists[MAX_DISTANCES]; /* sorted */ dist_t dists[MAX_DISTANCES]; /* sorted */
int reference[3]; /* reference beacons */
} scanner_t; } scanner_t;
static pool_t *pool_beacon; static pool_t *pool_beacon;
@@ -68,10 +69,26 @@ static void scanners_print_dists()
cur = &scanners[i].dists[j]; cur = &scanners[i].dists[j];
log(1, "\t%u : %d,%d\n", cur->dist, cur->b1, cur->b2); log(1, "\t%u : %d,%d\n", cur->dist, cur->b1, cur->b2);
} }
log(1, "\n"); // log(1, "zobi\n");
} }
} }
static void scanners_print_refs(scanner_t *s1, scanner_t *s2)
{
log_f(1, "s1:%ld s2:%ld\n", s1 - scanners, s2 - scanners);
log(1, "scanner %ld:", s1 - scanners);
for (int i = 0; i < 3; ++i) {
beacon_t *beacon = s1->beacons + s1->reference[i];
log(1, " (%d,%d,%d)", beacon->x, beacon->y, beacon->z);
}
log(1, "\nscanner %ld:", s2 - scanners);
for (int i = 0; i < 3; ++i) {
beacon_t *beacon = s2->beacons + s2->reference[i];
log(1, " (%d,%d,%d)", beacon->x, beacon->y, beacon->z);
}
log(1, "\n");
}
static void scanners_print() static void scanners_print()
{ {
beacon_t *cur; beacon_t *cur;
@@ -133,20 +150,61 @@ static int count_common_distances(scanner_t *s1, scanner_t *s2)
{ {
dist_t *d1 = s1->dists, *d2 = s2->dists; dist_t *d1 = s1->dists, *d2 = s2->dists;
int cur1 = 0, cur2 = 0, i; int cur1 = 0, cur2 = 0, i;
int ref_triangle = 0;
uint count = 0; uint count = 0;
beacon_t *beacon1 = s1->beacons, *beacon2 = s2->beacons; beacon_t *beacon1 = s1->beacons, *beacon2 = s2->beacons;
/* initialize s1 and s2 beacons count /* initialize s1 and s2 beacons count
*/ */
for (i = 0; i < s1->nbeacons; ++i) for (i = 0; i < MAX_BEACONS; ++i) {
beacon1[i].count = 0; beacon1[i].count = 0;
for (i = 0; i < s2->nbeacons; ++i)
beacon2[i].count = 0; beacon2[i].count = 0;
}
log_f(1, "(%ld, %ld): ", s1 - scanners, s2 - scanners); log_f(1, "(%ld, %ld): ", s1 - scanners, s2 - scanners);
while (cur1 < s1->ndists && cur2 < s2->ndists) { while (cur1 < s1->ndists && cur2 < s2->ndists) {
if (d1[cur1].dist == d2[cur2].dist) { if (d1[cur1].dist == d2[cur2].dist) {
log(1, " (%d,%d)=%u", cur1, cur2, d1[cur1].dist); log(1, " (%d,%d)=%u", cur1, cur2, d1[cur1].dist);
if (ref_triangle == 0) {
s1->reference[0] = d1[cur1].b1;
s1->reference[1] = d1[cur1].b2;
s2->reference[0] = d2[cur2].b1;
s2->reference[1] = d2[cur2].b2;
ref_triangle += 2;
} else if (ref_triangle == 2) {
if (d1[cur1].b1 == s1->reference[0] ||
d1[cur1].b1 == s1->reference[1]) {
s1->reference[2] = d2[cur1].b2;
if (d2[cur2].b1 == s1->reference[0] ||
d2[cur2].b1 == s1->reference[1]) {
s2->reference[2] = d2[cur2].b2;
} else {
s2->reference[2] = d2[cur2].b1;
}
ref_triangle++;
} else if (d1[cur1].b2 == s1->reference[0] ||
d1[cur1].b2 == s1->reference[1]) {
s1->reference[2] = d1[cur1].b1;
if (d2[cur2].b1 == s1->reference[0] ||
d2[cur2].b1 == s1->reference[1]) {
s2->reference[2] = d2[cur2].b2;
} else {
s2->reference[2] = d2[cur2].b1;
}
ref_triangle++;
}
if (ref_triangle == 3) {
if (d1[cur1].b1 == s1->reference[0] ||
d1[cur1].b1 == s1->reference[1]) {
s1->reference[2] = d2[cur1].b2;
ref_triangle++;
} else if (d1[cur1].b2 == s1->reference[0] ||
d1[cur1].b2 == s1->reference[1]) {
s1->reference[2] = d1[cur1].b1;
ref_triangle++;
}
}
}
++beacon1[d1[cur1].b1].count; ++beacon1[d1[cur1].b1].count;
++beacon1[d1[cur1].b2].count; ++beacon1[d1[cur1].b2].count;
++beacon2[d2[cur2].b1].count; ++beacon2[d2[cur2].b1].count;
@@ -161,7 +219,7 @@ static int count_common_distances(scanner_t *s1, scanner_t *s2)
++cur2; ++cur2;
} }
} }
log_i(3, "\n"); log_i(1, "\n");
return count; return count;
} }
@@ -192,11 +250,11 @@ static void calc_square_distances()
} }
} }
scanners_print_dists(); //scanners_print_dists();
mergesort(scanner->dists, 0, scanner->ndists - 1); mergesort(scanner->dists, 0, scanner->ndists - 1);
} }
scanners_print_dists(); scanners_print_dists();
log(1, "\n"); //log(1, "\n");
} }
/* read input /* read input
@@ -236,7 +294,7 @@ static int read_lines()
} }
} }
free(buf); free(buf);
scanners_print(); //scanners_print();
calc_square_distances(); calc_square_distances();
for (int i = 0; i < nscanners - 1; ++i) { for (int i = 0; i < nscanners - 1; ++i) {
for (int j = i + 1; j < nscanners; ++j) { for (int j = i + 1; j < nscanners; ++j) {
@@ -245,16 +303,18 @@ static int read_lines()
log(1, "common(%d, %d) = %d\n", i, j, count); log(1, "common(%d, %d) = %d\n", i, j, count);
for (int k = 0; k < scanners[i].nbeacons; ++k) { for (int k = 0; k < scanners[i].nbeacons; ++k) {
beacon_t *beacon = scanners[i].beacons + k; beacon_t *beacon = scanners[i].beacons + k;
if (beacon->count >= 11) //if (beacon->count >= 11)
log(1, "s1(%d, %d, %d): %d\n", beacon->x, beacon->y, log(1, "s1(%d, %d, %d): %d\n", beacon->x, beacon->y,
beacon->z, beacon->count); beacon->z, beacon->count);
} }
for (int k = 0; k < scanners[j].nbeacons; ++k) { for (int k = 0; k < scanners[j].nbeacons; ++k) {
beacon_t *beacon = scanners[j].beacons + k; beacon_t *beacon = scanners[j].beacons + k;
if (beacon->count >= 11) //if (beacon->count >= 11)
log(1, "s2(%d, %d, %d): %d\n", beacon->x, beacon->y, log(1, "s2(%d, %d, %d): %d\n", beacon->x, beacon->y,
beacon->z, beacon->count); beacon->z, beacon->count);
} }
scanners_print_refs(scanners + i, scanners + j);
} }
} }
} }