Advertisement
Guest User

Untitled

a guest
Dec 21st, 2023
705
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.37 KB | None | 0 0
  1.     private static void part2(String[] rows, int targetSteps) {
  2.         var start = findStart(rows);
  3.         int ymax = rows.length;
  4.         int xmax = rows[0].length();
  5.  
  6.         var visited = new HashSet<Xy>();
  7.         var frontier = new HashSet<Xy>();
  8.         frontier.add(start);
  9.  
  10.         long[] counts = new long[3];
  11.  
  12.         int[] frontiers = new int[xmax];
  13.         int[] d1 = new int[xmax];
  14.         int[] d2 = new int[xmax];
  15.  
  16.         int step = 0;
  17.         while (true) {
  18.  
  19.             var newFrontier = new HashSet<Xy>();
  20.             for (var p : frontier) {
  21.                 for (var d : Dir.values()) {
  22.                     int x = p.x + d.x;
  23.                     int y = p.y + d.y;
  24.                     int x1 = (x % xmax);
  25.                     int y1 = (y % ymax);
  26.                     x1 = x1 >= 0 ? x1 : x1 + xmax;
  27.                     y1 = y1 >= 0 ? y1 : y1 + ymax;
  28.  
  29.                     if (rows[y1].charAt(x1) != '#') {
  30.                         var q = new Xy(x, y);
  31.                         if (visited.add(q)) {
  32.                             newFrontier.add(q);
  33.                         }
  34.                     }
  35.                 }
  36.             }
  37.  
  38.             int fsize = newFrontier.size();
  39.             counts[2] = fsize + counts[0];
  40.             counts[0] = counts[1];
  41.             counts[1] = counts[2];
  42.  
  43.             int ix = step % xmax;
  44.             if (step >= xmax) {
  45.                 int dx = fsize - frontiers[ix];
  46.                 d2[ix] = dx - d1[ix];
  47.                 d1[ix] = dx;
  48.             }
  49.             frontiers[ix] = fsize;
  50.  
  51.             frontier = newFrontier;
  52.             step++;
  53.  
  54.             if (step >= 2*xmax) {
  55.                 if (Arrays.stream(d2).allMatch(i -> i == 0)) {
  56.                     break;
  57.                 }
  58.             }
  59.         }
  60.  
  61.         System.out.println("step: " + step);
  62.         System.out.println(counts[2]);
  63.         System.out.println(Arrays.toString(frontiers));
  64.         System.out.println(Arrays.toString(d1));
  65.         System.out.println(Arrays.toString(d2));
  66.  
  67.         // extrapolate
  68.         for (int i = step; i < targetSteps; i++) {
  69.             int ix = i % xmax;
  70.             d1[ix] += d2[ix];
  71.             frontiers[ix] += d1[ix];
  72.  
  73.             counts[2] = counts[0] + frontiers[ix];
  74.             counts[0] = counts[1];
  75.             counts[1] = counts[2];
  76.         }
  77.  
  78.         System.out.println(counts[2]);
  79.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement