Advertisement
Guest User

Untitled

a guest
Dec 20th, 2018
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.26 KB | None | 0 0
  1. package Advent2018;
  2.  
  3. import graph.DGraph;
  4. import graph.Graph;
  5. import graph.SearchType;
  6. import util.AdventOfCode;
  7. import util.Direction;
  8. import util.Node;
  9.  
  10. import java.util.*;
  11.  
  12. public class Day20 extends AdventOfCode {
  13.  
  14.     Graph<Node> graph;
  15.     String in;
  16.     Node root = new Node(0, 0);
  17.     long part2;
  18.  
  19.     static Map<Character, Direction> dirs = new HashMap<>();
  20.  
  21.     static {
  22.         dirs.put('N', Direction.NORTH);
  23.         dirs.put('E', Direction.EAST);
  24.         dirs.put('S', Direction.SOUTH);
  25.         dirs.put('W', Direction.WEST);
  26.     }
  27.  
  28.     public Day20(List<String> input) {
  29.         super(input);
  30.         title = "A Regular Map";
  31.         part1Description = "Longest shortest path: ";
  32.         part2Description = "Paths >= 1000 doors: ";
  33.     }
  34.  
  35.     @Override
  36.     public Object part1() {
  37.         buildGraph(0, root);
  38.         List<List<Node>> paths = new ArrayList<>();
  39.         for (Node node : graph.getVertices()) {
  40.             if (!node.equals(root)) {
  41.                 paths.add(graph.search(root, node, SearchType.BFS));
  42.             }
  43.         }
  44.         part2 = paths.stream().mapToInt(List::size).filter(x -> x > 1000).count();
  45.         return paths.stream().mapToInt(List::size).max().getAsInt() - 1;
  46.     }
  47.  
  48.     @Override
  49.     public Object part2() {
  50.         return part2;
  51.     }
  52.  
  53.     int buildGraph(int pos, Node n) {
  54.         Node next = n;
  55.         while (pos < in.length() - 1) {
  56.             char c = in.charAt(pos);
  57.             switch (c) {
  58.                 case 'N':
  59.                 case 'E':
  60.                 case 'S':
  61.                 case 'W':
  62.                     next = dirs.get(c).move(n);
  63.                     graph.addEdge(n, next);
  64.                     break;
  65.                 case '(':
  66.                     pos = buildGraph(pos + 1, n);
  67.                     while (in.charAt(pos) == '|') {
  68.                         pos = buildGraph(pos + 1, n);
  69.                     }
  70.                     break;
  71.                 case '|':
  72.                 case ')':
  73.                     return pos;
  74.             }
  75.             pos++;
  76.             n = next;
  77.         }
  78.         return pos;
  79.     }
  80.  
  81.     @Override
  82.     public void parse() {
  83.         graph = new DGraph<>();
  84.         in = input.get(0).substring(1, input.get(0).length() - 1);
  85.     }
  86.  
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement