Advertisement
Guest User

Untitled

a guest
Dec 16th, 2022
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.63 KB | Source Code | 0 0
  1. package helpers;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Objects;
  6. import java.util.TreeSet;
  7.  
  8. public class Tunnel {
  9.     public int rate;
  10.     public String name;
  11.     public boolean open;
  12.     public ArrayList<String> neighbors;
  13.     public HashMap<String, Integer> neighborsWithWeight;
  14.  
  15.  
  16.     public Tunnel(String name, int rate, ArrayList<String> neighbors) {
  17.         this.name = name;
  18.         this.rate = rate;
  19.         this.neighbors = neighbors;
  20.         this.open = (rate <= 0);
  21.     }
  22.  
  23.     public String toString() {
  24.         return "(name: " + name + ",rate: " + rate + ",neighbors: " + neighbors + ", open: " + open + ", neighborsWithWeight: " + neighborsWithWeight + ")";
  25.     }
  26. }
  27.  
  28.     public static void ex16() {
  29.         String[] inhalt;
  30.         TreeSet<String> tunnelNames = new TreeSet<>();
  31.         TreeSet<String> tunnelNamesReallyNeeded = new TreeSet<>();
  32.         HashMap<String, Tunnel> tunnels = new HashMap<>();
  33.         Tunnel tunnel;
  34.         try {
  35.             inhalt = Files.readString(Paths.get("./files/AoC/AoC16.txt")).split("\n");
  36.         } catch (IOException e) {
  37.             System.out.println("file error");
  38.             return;
  39.         }
  40.         String zeilenPart;
  41.         String valveName;
  42.         int rate;
  43.         ArrayList<String> leadingTo;
  44.         for (String zeile : inhalt) {
  45.             valveName = zeile.split(" has flow rate=")[0].replace("Valve ", "");
  46.             zeilenPart = zeile.split(" has flow rate=")[1];
  47.             rate = Integer.parseInt(zeilenPart.split("; tunnel(s)? lead(s)? to valve(s)? ")[0]);
  48.             leadingTo = new ArrayList<>(List.of(zeilenPart.split("; tunnel(s)? lead(s)? to valve(s)? ")[1].split(", ")));
  49.             tunnelNames.add(valveName);
  50.             tunnels.put(valveName, new Tunnel(valveName, rate, leadingTo));
  51.         }
  52.  
  53.         for (String tunnelName : tunnelNames) {
  54.             tunnels.get(tunnelName).neighborsWithWeight = ex16_createNeighborWeight(tunnels.get(tunnelName), tunnelNames, tunnels, 30);
  55.             System.out.println(tunnelName + ": " + tunnels.get(tunnelName).neighborsWithWeight);
  56.             if(tunnels.get(tunnelName).rate > 0) {
  57.                 tunnelNamesReallyNeeded.add(tunnelName);
  58.             }
  59.         }
  60.  
  61.  
  62.         String currentTunnel = "AA";
  63.         int maxMinutes = 30;
  64.         System.out.println("ex16: " + ex16_findHighestRelease(currentTunnel, maxMinutes, tunnels, tunnelNamesReallyNeeded, 0));
  65.         currentTunnel = "AA";
  66.         maxMinutes = 26;
  67.         System.out.println("ex16_2: " + ex16_findHighestReleaseWithElephant(currentTunnel, currentTunnel, maxMinutes, maxMinutes, tunnels, tunnelNamesReallyNeeded, 0));
  68.         // works, but took around 10 hours xD
  69.     }
  70.  
  71.     public static int ex16_findHighestReleaseWithElephant(String currentTunnel, String currentTunnelEl, int minutes, int minutesEl, HashMap<String, Tunnel> tunnels, TreeSet<String> tunnelNames, int maxRelease) {
  72.         int currentTunnelRateTimesMinutesLeft, currentWeight, currentTunnelRateTimesMinutesLeftEl, currentWeightEl;
  73.         TreeSet<String> shortTunnelNames;
  74.         int newMaxRelease = 0, meNext = 0, elNext = 0;
  75.         if(minutes <= 0 && minutesEl <= 0) {
  76.             return maxRelease;
  77.         }
  78.         for (String nextTunnel : tunnelNames) {
  79.             shortTunnelNames = new TreeSet<>(tunnelNames);
  80.             shortTunnelNames.remove(nextTunnel);
  81.             currentWeight = tunnels.get(currentTunnel).neighborsWithWeight.get(nextTunnel);
  82.             currentWeightEl = tunnels.get(currentTunnelEl).neighborsWithWeight.get(nextTunnel);
  83.             currentTunnelRateTimesMinutesLeft = (minutes - currentWeight) * tunnels.get(nextTunnel).rate;
  84.             currentTunnelRateTimesMinutesLeftEl = (minutesEl - currentWeightEl) * tunnels.get(nextTunnel).rate;
  85.             if((minutes - currentWeight) >= 0 && !nextTunnel.equals(currentTunnel)) {
  86.                 meNext = currentTunnelRateTimesMinutesLeft + ex16_findHighestReleaseWithElephant(nextTunnel, currentTunnelEl, (minutes - currentWeight), minutesEl, tunnels, shortTunnelNames, maxRelease);
  87.             }
  88.             if((minutesEl - currentWeightEl) >= 0 && !nextTunnel.equals(currentTunnelEl)) {
  89.                 elNext = currentTunnelRateTimesMinutesLeftEl + ex16_findHighestReleaseWithElephant(currentTunnel, nextTunnel, minutes, (minutesEl - currentWeightEl), tunnels, shortTunnelNames, maxRelease);
  90.             }
  91.             newMaxRelease = Math.max(Math.max(meNext, elNext), newMaxRelease);
  92.         }
  93.         return Math.max(maxRelease, newMaxRelease);
  94.     }
  95.  
  96.     public static int ex16_findHighestRelease(String currentTunnel, int minutes, HashMap<String, Tunnel> tunnels, TreeSet<String> tunnelNames, int maxRelease) {
  97.         int currentTunnelRateTimesMinutesLeft, currentWeight;
  98.         TreeSet<String> shortTunnelNames;
  99.         int newMaxRealease = 0;
  100.         if(minutes <= 0) {
  101.             return maxRelease;
  102.         }
  103.         for (String neigh : tunnelNames) {
  104.             if(neigh.equals(currentTunnel)) {
  105.                 continue;
  106.             }
  107.             currentWeight = tunnels.get(currentTunnel).neighborsWithWeight.get(neigh);
  108.             if((minutes - currentWeight) < 0) {
  109.                 continue;
  110.             }
  111.             shortTunnelNames = new TreeSet<>(tunnelNames);
  112.             shortTunnelNames.remove(neigh);
  113.             currentTunnelRateTimesMinutesLeft = (minutes - currentWeight) * tunnels.get(neigh).rate;
  114.             newMaxRealease = Math.max(currentTunnelRateTimesMinutesLeft + ex16_findHighestRelease(neigh, (minutes - currentWeight), tunnels, shortTunnelNames, maxRelease), newMaxRealease);
  115.         }
  116.         return Math.max(maxRelease, newMaxRealease);
  117.     }
  118.  
  119.     public static HashMap<String, Integer> ex16_createNeighborWeight(Tunnel tunnel, TreeSet<String> tunnelNames, HashMap<String, Tunnel> tunnels, int maxPath) {
  120.         HashMap<String, Integer> neighborWeights = new HashMap<>();
  121.  
  122.         int weight = 1, weightToOpen = 1;
  123.         for (String tunnelName : tunnelNames) {
  124.             if(tunnelName.equals(tunnel.name) || tunnels.get(tunnelName).rate == 0) {
  125.                 continue;
  126.             }
  127.             if(tunnel.neighbors.contains(tunnelName)) {
  128.                 neighborWeights.put(tunnelName, weight + weightToOpen);
  129.                 continue;
  130.             }
  131.             neighborWeights.put(tunnelName, ex16_shortestPath(tunnel, tunnelName, tunnels, new TreeSet<>(), maxPath, weight, weightToOpen, weight));
  132.         }
  133.  
  134.         return neighborWeights;
  135.     }
  136.  
  137.     public static int ex16_shortestPath(Tunnel tunnel, String tunnelName, HashMap<String, Tunnel> tunnels, TreeSet<String> visited, int maxPath, int weight, int weightToOpen, int path) {
  138.  
  139.         TreeSet<String> newVisited = new TreeSet<String>(visited);
  140.         int returnPath = Integer.MAX_VALUE;
  141.         for (String neigh : tunnel.neighbors) {
  142.             if(visited.contains(neigh)) {
  143.                 continue;
  144.             }
  145.             if(path > maxPath) {
  146.                 continue;
  147.             }
  148.             if(neigh.equals(tunnelName)) {
  149.                 returnPath = Math.min(path + weightToOpen, maxPath);
  150.             }
  151.             newVisited.add(neigh);
  152.             int shortestPath = ex16_shortestPath(tunnels.get(neigh), tunnelName, tunnels, newVisited, maxPath, weight, weightToOpen, path + weight);
  153.             if(shortestPath < maxPath) {
  154.                 int shortestPathNew = ex16_shortestPath(tunnels.get(neigh), tunnelName, tunnels, newVisited, shortestPath, weight, weightToOpen, path + weight);
  155.                 returnPath = Math.min(Math.min(shortestPath, shortestPathNew), returnPath);
  156.             }
  157.         }
  158.         return returnPath;
  159.     }
  160.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement