diff --git a/java/src/main/java/day2/Game.java b/java/src/main/java/day2/Game.java new file mode 100644 index 0000000..bcf12e0 --- /dev/null +++ b/java/src/main/java/day2/Game.java @@ -0,0 +1,29 @@ +package day2; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Getter +public class Game { + private static final String GAME_ID_PREFIX = "Game "; + private static final String GAME_ID_SEPARATOR = ":"; + private static final String ROUNDS_SEPARATOR = ";"; + + private final Integer id; + private final List rounds; + + public Game(String gameRepresentation) { + String[] splitGameRepresentation = gameRepresentation.split(GAME_ID_SEPARATOR, 2); + this.id = Integer.parseInt(splitGameRepresentation[0].replace(GAME_ID_PREFIX, "")); + this.rounds = Arrays.stream(splitGameRepresentation[1].split(ROUNDS_SEPARATOR)) + .map(Round::new) + .collect(Collectors.toList()); + } + + + + +} diff --git a/java/src/main/java/day2/Main.java b/java/src/main/java/day2/Main.java new file mode 100644 index 0000000..fca1cff --- /dev/null +++ b/java/src/main/java/day2/Main.java @@ -0,0 +1,43 @@ +package day2; + +import util.FileReader; + +import java.util.List; + +public class Main { + private static final Round ROUND_MAXIMUM_THRESHOLD = new Round(12, 14, 13); + + public static void main(String[] args) { + String inputFilePath = System.getProperty("user.dir") + "\\java\\src\\main\\java\\day2\\input.txt"; + FileReader reader = new FileReader(inputFilePath); + List inputData = reader.readContents(); + + Integer validGamesCount = inputData.stream() + .map(Game::new) + .filter(game -> { + Round round = game.getRounds().stream() + .reduce(Round::mergePrevailMaximum) + .orElseThrow(RuntimeException::new); + return round.getRedCount() <= ROUND_MAXIMUM_THRESHOLD.getRedCount() + && round.getBlueCount() <= ROUND_MAXIMUM_THRESHOLD.getBlueCount() + && round.getGreenCount() <= ROUND_MAXIMUM_THRESHOLD.getGreenCount(); + } + ).map(Game::getId) + .reduce(Integer::sum) + .orElse(0); + + System.out.println(validGamesCount); + + Integer cubesPowerCount = inputData.stream() + .map(Game::new) + .map(Game::getRounds) + .map(rounds -> rounds.stream() + .reduce(Round::mergePrevailMaximum) + .orElseThrow(RuntimeException::new)) + .map(round -> round.getGreenCount() * round.getRedCount() * round.getBlueCount()) + .reduce(Integer::sum) + .orElse(0); + + System.out.println(cubesPowerCount); + } +} diff --git a/java/src/main/java/day2/Round.java b/java/src/main/java/day2/Round.java new file mode 100644 index 0000000..c4b633e --- /dev/null +++ b/java/src/main/java/day2/Round.java @@ -0,0 +1,45 @@ +package day2; + +import lombok.Getter; + +import java.util.Arrays; + +@Getter +public class Round { + private static final String ROUND_COLORS_SEPARATOR = ","; + private static final String RED_SUFFIX = "red"; + private static final String BLUE_SUFFIX = "blue"; + private static final String GREED_SUFFIX = "green"; + + private Integer redCount = 0; + private Integer blueCount = 0; + private Integer greenCount = 0; + + public Round(Integer redCount, Integer blueCount, Integer greenCount) { + this.redCount = redCount; + this.blueCount = blueCount; + this.greenCount = greenCount; + } + + public Round(String roundRepresentation) { + Arrays.stream(roundRepresentation.split(ROUND_COLORS_SEPARATOR, 3)) + .map(colorRepresentation -> colorRepresentation.replaceAll(" ", "")) + .forEach(colorRepresentation -> { + if (colorRepresentation.contains(RED_SUFFIX)) { + this.redCount = Integer.parseInt(colorRepresentation.replace(RED_SUFFIX, "")); + } else if (colorRepresentation.contains(BLUE_SUFFIX)) { + this.blueCount = Integer.parseInt(colorRepresentation.replace(BLUE_SUFFIX, "")); + } else if (colorRepresentation.contains(GREED_SUFFIX)) { + this.greenCount = Integer.parseInt(colorRepresentation.replace(GREED_SUFFIX, "")); + } + }); + } + + public Round mergePrevailMaximum(Round otherRound) { + return new Round( + Math.max(this.redCount, otherRound.redCount), + Math.max(this.blueCount, otherRound.blueCount), + Math.max(this.greenCount, otherRound.greenCount) + ); + } +} diff --git a/java/src/main/java/util/FileReader.java b/java/src/main/java/util/FileReader.java index 56a1467..247be14 100644 --- a/java/src/main/java/util/FileReader.java +++ b/java/src/main/java/util/FileReader.java @@ -21,7 +21,7 @@ public class FileReader { scanner.useDelimiter("\n"); List data = new ArrayList<>(); while (scanner.hasNext()) { - data.add(scanner.next()); + data.add(scanner.next().replace("\r", "")); } return data; } catch (Exception e) {