From 877d1c4fa52121a5003439be2d90f74f517f4f9a Mon Sep 17 00:00:00 2001 From: MiguelMLorente Date: Sat, 2 Dec 2023 12:21:45 +0100 Subject: [PATCH 1/2] Day 1 implementation in Java - bugfix --- java/README.md | 7 +++++ java/src/main/java/day1/Main.java | 48 ++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 java/README.md diff --git a/java/README.md b/java/README.md new file mode 100644 index 0000000..e82ca83 --- /dev/null +++ b/java/README.md @@ -0,0 +1,7 @@ +### How to run? + +You need to have your JDK installed. I'll be using JDK-23. + +Run from IDE directly, as JAR files have not yet been created. + +Different problems are in different folders. Generally a variable contains the value that controlls whether the first sub-problem is executed or the second. \ No newline at end of file diff --git a/java/src/main/java/day1/Main.java b/java/src/main/java/day1/Main.java index 9cf568d..e34e87c 100644 --- a/java/src/main/java/day1/Main.java +++ b/java/src/main/java/day1/Main.java @@ -2,12 +2,25 @@ package day1; import util.FileReader; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; public class Main { // Part 1 one of the problem has this flag set to false, while part 2 has it set to true private static final boolean IS_NUMBER_SPELLING_ENABLED = true; + private static final HashMap SPELLED_NUMBERS = new HashMap() {{ + put("one", '1'); + put("two", '2'); + put("three", '3'); + put("four", '4'); + put("five", '5'); + put("six", '6'); + put("seven", '7'); + put("eight", '8'); + put("nine", '9'); + }}; public static void main(String[] args) { String inputFilePath = System.getProperty("user.dir") + "\\java\\src\\main\\java\\day1\\input.txt"; @@ -36,23 +49,24 @@ public class Main { } private static String replaceSpelledDigits(String string) { - return string - .replaceAll("oneight", "18") - .replaceAll("threeight", "38") - .replaceAll("fiveight", "58") - .replaceAll("nineight", "98") - .replaceAll("twone", "21") - .replaceAll("eightwo", "82") - .replaceAll("eighthree", "83") - .replaceAll("one", "1") - .replaceAll("two", "2") - .replaceAll("three", "3") - .replaceAll("four", "4") - .replaceAll("five", "5") - .replaceAll("six", "6") - .replaceAll("seven", "7") - .replaceAll("eight", "8") - .replaceAll("nine", "9"); + StringBuilder newStringBuilder = new StringBuilder(string); + SPELLED_NUMBERS.keySet().stream() + .filter(string::contains) + .forEach(number -> getIndexesOfAllSubstringOccurrences(string, number) + .forEach(index -> newStringBuilder.setCharAt(index, SPELLED_NUMBERS.get(number))) + ); + + return newStringBuilder.toString(); + } + + private static List getIndexesOfAllSubstringOccurrences(String string, String substring) { + List indexes = new ArrayList<>(); + int index = string.indexOf(substring); + while (index >= 0) { + indexes.add(index); + index = string.indexOf(substring, index + 1); + } + return indexes; } } From e98bb258b7b76b548789c91403db10994586b67c Mon Sep 17 00:00:00 2001 From: MiguelMLorente Date: Sat, 2 Dec 2023 14:02:31 +0100 Subject: [PATCH 2/2] Day 2 implementation in Java --- java/src/main/java/day2/Game.java | 29 ++++++++++++++++ java/src/main/java/day2/Main.java | 43 +++++++++++++++++++++++ java/src/main/java/day2/Round.java | 45 +++++++++++++++++++++++++ java/src/main/java/util/FileReader.java | 2 +- 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 java/src/main/java/day2/Game.java create mode 100644 java/src/main/java/day2/Main.java create mode 100644 java/src/main/java/day2/Round.java 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) {