Skip to content

Instantly share code, notes, and snippets.

@desrtfx
Last active December 14, 2015 09:09
Show Gist options
  • Save desrtfx/96b01de798f89e0cdecd to your computer and use it in GitHub Desktop.
Save desrtfx/96b01de798f89e0cdecd to your computer and use it in GitHub Desktop.
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Day14 {
private static final String FILENAME = "D:\\Dokumente\\Java Workspace\\AdventOfCodeDay14\\InputDay14.txt";
private static final Pattern PATTERN = Pattern
.compile("(.+) can fly (\\d+) km/s for (\\d+) seconds, but then must rest for (\\d+) seconds.");
private static final int TARGET_TIME = 2503; // 2503 Seconds
class Reindeer {
String name;
int speed;
int durationFly;
int durationRest;
int distance;
int points;
public Reindeer(String name, int speed, int durationFly,
int durationRest) {
this.name = name;
this.speed = speed;
this.durationFly = durationFly;
this.durationRest = durationRest;
distance = 0;
points = 0;
}
int getFullCycleTime() {
return durationFly + durationRest;
}
int getFullCycleDist() {
return speed * durationFly;
}
}
public static void main(String[] args) {
Day14 day14 = new Day14();
List<String> data = FileIO.getFileAsList(FILENAME);
List<Reindeer> racers = new ArrayList<>();
int maxDistance = Integer.MIN_VALUE;
for (String s : data) {
Matcher m = PATTERN.matcher(s);
if (m.matches()) {
Reindeer tmp = day14.new Reindeer(m.group(1),
Integer.parseInt(m.group(2)), Integer.parseInt(m
.group(3)), Integer.parseInt(m.group(4)));
int fullTravelPeriods = TARGET_TIME / tmp.getFullCycleTime();
int remainingTravelTime = TARGET_TIME % tmp.getFullCycleTime();
int distTravelled = (fullTravelPeriods * tmp.getFullCycleDist());
int additionalDist = 0;
if (remainingTravelTime >= tmp.durationFly) {
additionalDist = tmp.getFullCycleDist();
} else {
additionalDist = remainingTravelTime * tmp.speed;
}
distTravelled += additionalDist;
racers.add(tmp);
if (maxDistance < distTravelled) {
maxDistance = distTravelled;
}
}
}
System.out.println("Part 1: Max Distance = " + maxDistance);
for (int second = 0; second < TARGET_TIME; second++) {
maxDistance = Integer.MIN_VALUE; // reset max distance
for (int i = 0; i < racers.size(); i++) {
Reindeer r = racers.get(i);
int remainingTravelTime = second % r.getFullCycleTime();
if (remainingTravelTime < r.durationFly) {
r.distance += r.speed;
}
if (r.distance > maxDistance) {
maxDistance = r.distance;
}
}
for (int i = 0; i < racers.size(); i++) {
Reindeer r = racers.get(i);
if (r.distance == maxDistance) {
r.points++;
}
}
}
int maxPoints = Integer.MIN_VALUE;
for (int i = 0; i < racers.size(); i++) {
Reindeer r = racers.get(i);
if (maxPoints < r.points) {
maxPoints = r.points;
}
}
System.out.println("Part 2: Max Points = " + maxPoints);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment