Guest User

Untitled

a guest
Dec 23rd, 2018
270
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package Advent2018;
  2.  
  3. import util.AdventOfCode;
  4.  
  5. import java.util.*;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8.  
  9. public class Day23 extends AdventOfCode {
  10.  
  11.     public Day23(List<String> input) {
  12.         super(input);
  13.     }
  14.  
  15.     class Node3d {
  16.         int x;
  17.         int y;
  18.         int z;
  19.         long range;
  20.         long getRange() { return range; }
  21.         Node3d(int x, int y, int z, long range) {
  22.             this.x = x;
  23.             this.y = y;
  24.             this.z = z;
  25.             this.range = range;
  26.         }
  27.  
  28.         int distance(Node3d other) {
  29.             return Math.abs(this.x - other.x) + Math.abs(this.y - other.y) + Math.abs(this.z - other.z);
  30.         }
  31.  
  32.         boolean inRange(Node3d other) {
  33.             return distance(other) <= other.range;
  34.         }
  35.      }
  36.  
  37.     List<Node3d> point;
  38.  
  39.     @Override
  40.     public Object part1() {
  41.         Node3d max = point.stream().max(Comparator.comparing(Node3d::getRange)).get();
  42.         System.out.println(max.range);
  43.         return point.stream().filter(x -> x.inRange(max)).count();
  44.     }
  45.  
  46.     @Override
  47.     public Object part2() {
  48.         TreeMap<Integer, Integer> ranges = new TreeMap<>();
  49.         for (Node3d n : point) {
  50.             int distFromZero = n.distance(new Node3d(0, 0, 0, 0));
  51.             ranges.put(Math.max(0, distFromZero -  (int) n.range), 1);
  52.             ranges.put(distFromZero + (int) n.range, -1);
  53.         }
  54.         int count = 0;
  55.         int result = 0;
  56.         int maxCount = 0;
  57.         for (Map.Entry<Integer, Integer> each : ranges.entrySet()) {
  58.             count += each.getValue();
  59.             if (count > maxCount) {
  60.                 result = each.getKey();
  61.                 maxCount = count;
  62.             }
  63.         }
  64.         return result;
  65.     }
  66.  
  67.     @Override
  68.     public void parse() {
  69.         point = new ArrayList<>();
  70.         Pattern p = Pattern.compile("pos=<(-?\\d+),(-?\\d+),(-?\\d+)>, r=(\\d+)");
  71.         for (String line : input) {
  72.             Matcher m = p.matcher(line);
  73.             if (m.find()) {
  74.                 int x = Integer.parseInt(m.group(1));
  75.                 int y = Integer.parseInt(m.group(2));
  76.                 int z = Integer.parseInt(m.group(3));
  77.                 long r = Long.parseLong(m.group(4));
  78.                 Node3d n = new Node3d(x, y, z, r);
  79.                 point.add(n);
  80.             }
  81.         }
  82.     }
  83.  
  84. }
RAW Paste Data