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;
beacon_t beacons[MAX_BEACONS];
dist_t dists[MAX_DISTANCES]; /* sorted */
int reference[3]; /* reference beacons */
} scanner_t;
static pool_t *pool_beacon;
@@ -68,10 +69,26 @@ static void scanners_print_dists()
cur = &scanners[i].dists[j];
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()
{
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;
int cur1 = 0, cur2 = 0, i;
int ref_triangle = 0;
uint count = 0;
beacon_t *beacon1 = s1->beacons, *beacon2 = s2->beacons;
/* initialize s1 and s2 beacons count
*/
for (i = 0; i < s1->nbeacons; ++i)
for (i = 0; i < MAX_BEACONS; ++i) {
beacon1[i].count = 0;
for (i = 0; i < s2->nbeacons; ++i)
beacon2[i].count = 0;
}
log_f(1, "(%ld, %ld): ", s1 - scanners, s2 - scanners);
while (cur1 < s1->ndists && cur2 < s2->ndists) {
if (d1[cur1].dist == d2[cur2].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].b2].count;
++beacon2[d2[cur2].b1].count;
@@ -161,7 +219,7 @@ static int count_common_distances(scanner_t *s1, scanner_t *s2)
++cur2;
}
}
log_i(3, "\n");
log_i(1, "\n");
return count;
}
@@ -192,11 +250,11 @@ static void calc_square_distances()
}
}
scanners_print_dists();
//scanners_print_dists();
mergesort(scanner->dists, 0, scanner->ndists - 1);
}
scanners_print_dists();
log(1, "\n");
//log(1, "\n");
}
/* read input
@@ -236,7 +294,7 @@ static int read_lines()
}
}
free(buf);
scanners_print();
//scanners_print();
calc_square_distances();
for (int i = 0; i < nscanners - 1; ++i) {
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);
for (int k = 0; k < scanners[i].nbeacons; ++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,
beacon->z, beacon->count);
}
for (int k = 0; k < scanners[j].nbeacons; ++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,
beacon->z, beacon->count);
}
scanners_print_refs(scanners + i, scanners + j);
}
}
}