]> code.bitgloo.com Git - clyne/advent-of-code.git/commitdiff
day15: part 1 speedup
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 16 Dec 2022 00:50:01 +0000 (19:50 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 16 Dec 2022 00:50:01 +0000 (19:50 -0500)
day15/part1.cpp

index fb537532e89ce9f85125067db3462321b72a038d..6c512f7269d022aa5dd36046c45ed9ee2e492033 100644 (file)
@@ -1,3 +1,4 @@
+#include <bitset>
 #include <cstdio>
 #include <iostream>
 #include <set>
@@ -7,8 +8,7 @@ constexpr long Y = 2000000;
 
 int main()
 {
-    std::set<int> xs;
-    std::set<int> bs;
+    std::bitset<8000000> xs;
     long px, py, bx, by;
 
     do {
@@ -17,33 +17,24 @@ int main()
         if (std::cin.eof())
             break;
 
-        auto a = sscanf(line.c_str(),
-            "Sensor at x=%ld, y=%ld: closest beacon is at x=%ld, y=%ld",
-            &px, &py, &bx, &by);
+        sscanf(line.c_str(),
+               "Sensor at x=%ld, y=%ld: closest beacon is at x=%ld, y=%ld",
+               &px, &py, &bx, &by);
 
-        std::cout << px << ' ' << py << ' ' << bx << ' ' << by;
+        long dist = std::abs(px - bx) + std::abs(py - by);
 
-        if (by == Y)
-            bs.insert(bx);
-
-        long ic = std::abs(px - bx) + std::abs(py - by);
-
-        if (Y < py - ic || Y > py + ic)
+        if (Y < py - dist || Y > py + dist)
             continue;
 
-        long spr = (ic - std::abs(py - Y));
+        px += 1000000;
+        long spr = dist - std::abs(py - Y);
         for (long j = 0; j <= spr; ++j) {
-            xs.insert(px + j);
-            xs.insert(px - j);
+            xs.set(px + j);
+            xs.set(px - j);
         }
-
-        std::cout << " -> " << xs.size() << std::endl;
     } while (1);
 
-    for (auto& b : bs)
-        xs.erase(b);
-
-    std::cout << "Part 1: " << xs.size() << std::endl;
+    std::cout << "Part 1: " << xs.count() - 1 << std::endl;
 
     return 0;
 }