Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.42 KB | None | 0 0
  1. package Advent2018;
  2.  
  3. import util.AdventOfCode;
  4. import util.ArrayUtils;
  5. import util.Direction;
  6.  
  7. import java.util.ArrayList;
  8. import java.util.HashSet;
  9. import java.util.List;
  10. import java.util.Set;
  11.  
  12. public class Day18 extends AdventOfCode {
  13.  
  14.     enum OrdinalDirection {
  15.         N(0, -1), NE(1, -1), E(1, 0), SE(1, 1), S(0, 1), SW(-1, 1), W(-1, 0), NW(-1, -1);
  16.         int dx;
  17.         int dy;
  18.         OrdinalDirection(int dx, int dy) {
  19.             this.dx = dx;
  20.             this.dy = dy;
  21.         }
  22.     }
  23.  
  24.     int[][] grid;
  25.     final char GROUND = '.';
  26.     final char TREES = '|';
  27.     final char LUMBER = '#';
  28.     int wood;
  29.     int lumberYards;
  30.  
  31.     final int GRID_SIZE = 50;
  32.  
  33.     Set<Integer> seen = new HashSet<>();
  34.  
  35.     int[] lookup = new int[28];
  36.  
  37.  
  38.     public Day18(List<String> input) {
  39.         super(input);
  40.         title = "Settlers of the North Pole";
  41.         part1Description = "Resources after 10 minutes: ";
  42.         part2Description = "Resources after 1 billion minutes: ";
  43.     }
  44.  
  45.     void minute() {
  46.         int[][] temp = ArrayUtils.intMatrixCopy(grid);
  47.         for (int j = 0; j < grid.length; j++) {
  48.             for (int k = 0; k < grid[j].length; k++) {
  49.                 List<Character> adj = getAdj(j, k);
  50.                 switch (grid[j][k]) {
  51.                     case GROUND:
  52.                         if (adj.stream().filter(x -> x == TREES).count() >= 3) {
  53.                             temp[j][k] = TREES;
  54.                             wood++;
  55.                         }
  56.                         break;
  57.                     case TREES:
  58.                         if (adj.stream().filter(x -> x == LUMBER).count() >= 3) {
  59.                             temp[j][k] = LUMBER;
  60.                             lumberYards++;
  61.                             wood--;
  62.                         }
  63.                         break;
  64.                     case LUMBER:
  65.                         if (!(adj.contains(TREES) && adj.contains(LUMBER))) {
  66.                             temp[j][k] = GROUND;
  67.                             lumberYards--;
  68.                         }
  69.                 }
  70.             }
  71.         }
  72.         grid = temp;
  73.     }
  74.  
  75.     @Override
  76.     public Object part1() {
  77.  
  78.         for (int i = 0; i < 10; i++) {
  79.             minute();
  80.         }
  81.  
  82.  
  83.         return wood * lumberYards;
  84.     }
  85.  
  86.     @Override
  87.     public Object part2() {
  88.  
  89.         for (int i = 10; i < 473; i++) {
  90.             minute();
  91.             if (i >= 445) {
  92.                 lookup[i - 445] = wood * lumberYards;
  93.             }
  94.         }
  95.  
  96.         return lookup[(999_999_999 - 445) % 28];
  97.     }
  98.  
  99.  
  100.  
  101.     List<Character> getAdj(int x, int y) {
  102.         List<Character> adj = new ArrayList<>();
  103.         for (OrdinalDirection dir : OrdinalDirection.values()) {
  104.             int nx = x + dir.dx;
  105.             int ny = y + dir.dy;
  106.             if (Direction.rangeCheck(nx, ny, GRID_SIZE)) {
  107.                 adj.add((char) grid[nx][ny]);
  108.             }
  109.         }
  110.         return adj;
  111.     }
  112.  
  113.  
  114.  
  115.     @Override
  116.     public void parse() {
  117.         //input = FileIO.getFileAsList("puzzle_input/test18.txt");
  118.         grid = new int[GRID_SIZE][GRID_SIZE];
  119.         for (int i = 0; i < input.size(); i++) {
  120.             for (int j = 0; j < input.get(i).length(); j++) {
  121.                 grid[i][j] = input.get(i).charAt(j);
  122.                 if (grid[i][j] == TREES) wood++;
  123.                 if (grid[i][j] == LUMBER) lumberYards++;
  124.             }
  125.         }
  126.  
  127.     }
  128.  
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement