Advertisement
Guest User

Untitled

a guest
Dec 4th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.32 KB | None | 0 0
  1. package Advent2018;
  2.  
  3. import util.AdventOfCode;
  4.  
  5. import java.util.Collections;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11.  
  12. public class Day4 extends AdventOfCode {
  13.  
  14.     Map<Integer, Map<Integer, Integer>> guards;
  15.  
  16.     public Day4(List<String> input) {
  17.         super(input);
  18.         title = "Repose Record";
  19.         part1Description = "Most sleepy guard * most asleep minute: ";
  20.         part2Description = "Any guard * Most Sleepy Minute: ";
  21.     }
  22.  
  23.     @Override
  24.     public Object part1() {
  25.         int max = 0;
  26.         int maxId = 0;
  27.         int maxMinute = 0;
  28.         for (Map.Entry<Integer, Map<Integer, Integer>> guard : guards.entrySet()) {
  29.             int val = guard.getValue().getOrDefault(9999, 0);
  30.             guard.getValue().remove(9999);
  31.             if (val > max) {
  32.                 max = val;
  33.                 maxId = guard.getKey();
  34.                 maxMinute = guard.getValue().entrySet().stream()
  35.                         .max(Map.Entry.comparingByValue())
  36.                         .get().getKey();
  37.             }
  38.         }
  39.         return maxId * maxMinute;
  40.     }
  41.  
  42.     @Override
  43.     public Object part2() {
  44.         int max = 0;
  45.         int maxMinute = 0;
  46.         int maxId = 0;
  47.         for (Map.Entry<Integer, Map<Integer, Integer>> guard : guards.entrySet()) {
  48.             if (guard.getValue().size() == 0) continue;
  49.             int min = guard.getValue().entrySet().stream()
  50.                     .max(Map.Entry.comparingByValue())
  51.                     .get().getKey();
  52.             if (guard.getValue().get(min) > max) {
  53.                 max = guard.getValue().getOrDefault(min, 0);
  54.                 maxMinute = min;
  55.                 maxId = guard.getKey();
  56.             }
  57.         }
  58.         return maxMinute * maxId;
  59.     }
  60.  
  61.     @Override
  62.     public void parse() {
  63.         guards = new HashMap<>();
  64.         Collections.sort(input);
  65.         Pattern p = Pattern.compile("\\[1518-([0-9]+)-([0-9]+) ([0-9]{2}):([0-9]{2})] ([\\w\\W]+)$");
  66.         Pattern p2 = Pattern.compile("Guard #(\\d+)");
  67.         int currentGuard = 0;
  68.         int startTime = 0;
  69.         for (String line : input) {
  70.             Matcher m = p.matcher(line);
  71.             if (m.find()) {
  72.  
  73.                 int min = Integer.parseInt(m.group(4));
  74.                 String detail = m.group(5);
  75.                 if (detail.startsWith("Guard")) {
  76.                     Matcher m2 = p2.matcher(detail);
  77.                     if (m2.find()) {
  78.                         currentGuard = Integer.parseInt(m2.group(1));
  79.                         guards.putIfAbsent(currentGuard, new HashMap<>());
  80.                     }
  81.                 } else {
  82.                     if (detail.equals("falls asleep")) {
  83.                         startTime = min;
  84.                     } else {
  85.                         for (int i = startTime; i < min; i++) {
  86.  
  87.                             // frequency map
  88.                             guards.get(currentGuard).put(i, guards.get(currentGuard).getOrDefault(i, 0) + 1);
  89.  
  90.                             // update total sum in freq map
  91.                             guards.get(currentGuard).put(9999, guards.get(currentGuard).getOrDefault(9999, 0) + 1);
  92.                         }
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement