diff --git a/src/main/java/de/advent_of_code_2025/two/Main.java b/src/main/java/de/advent_of_code_2025/two/Main.java new file mode 100644 index 0000000..197e299 --- /dev/null +++ b/src/main/java/de/advent_of_code_2025/two/Main.java @@ -0,0 +1,122 @@ +package de.advent_of_code_2025.two; + +import de.advent_of_code_2025.util.InputMangler; +import de.advent_of_code_2025.util.InputReader; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.LongStream; + +public class Main { + private static final record IdRange(Long start, Long end) { + public long sumDoubleSequence() { + return LongStream.range(start, end + 1).filter(IdRange::isDoubleSequence).sum(); + } + + public long sumAnySequence() { + return LongStream.range(start, end + 1).filter(IdRange::isAnySequence).sum(); + } + + private static boolean isAnySequence(long n) { + if(n < 10) { + return false; + } + + final List digits = getDigits(n).reversed(); + final String nString = String.valueOf(n); + + if(allDigitsSame(nString, digits)) { + return true; + } + + for(int i = 2; i < 6; i++) { + if(hasSequence(nString, digits, i)) { + return true; + } + } + + return false; + } + + private static final boolean allDigitsSame(String nString, List digits) { + return String.valueOf(digits.getFirst()).repeat(digits.size()).equals(nString); + } + + private static final boolean hasSequence(String nString, List digits, int sequenceLength) { + if(sequenceLength >= digits.size()) { + return false; + } + + return digits.subList(0, sequenceLength).stream().map(String::valueOf).collect(Collectors.joining()).repeat(digits.size() / sequenceLength).equals(nString); + } + + private static boolean isDoubleSequence(long n) { + if(n < 10) { + return false; + } + + final List digits = getDigits(n); + + if(digits.size() % 2 > 0) { // odd digit numbers not relevant + return false; + } + + List half = digits.subList(0, digits.size() / 2); + + return digits.subList(digits.size() / 2, digits.size()).equals(half); + } + + private static final List getDigits(long n) { + final List digits = new ArrayList<>(); + + long lastDigit = n % 10; + + digits.add(lastDigit); + + n = n / 10; + + while (n > 0) { + lastDigit = n % 10; + + digits.add(lastDigit); + + n = n / 10; + } + + return digits; + } + } + + public static void main(String[] args) throws Throwable { + final String line = InputReader.readSingle(args); + final List lines = InputMangler.mangleSingle(line, ","); + final List idRanges = setupRanges(lines); + long sameDigitSum = 0; + long anySequenceSum = 0; + + // Part 1 + + for (IdRange range : idRanges) { + sameDigitSum += range.sumDoubleSequence(); + } + + System.out.println(sameDigitSum); + + // Part 2 + + for (IdRange range : idRanges) { + anySequenceSum += range.sumAnySequence(); + } + + System.out.println(anySequenceSum); + } + + private static final List setupRanges(List lines) { + return lines.stream().map(line -> { + final String[] split = line.split("-"); + + return new IdRange(Long.parseLong(split[0]), Long.parseLong(split[1])); + }).collect(Collectors.toList()); + } +} diff --git a/src/main/java/de/advent_of_code_2025/util/InputMangler.java b/src/main/java/de/advent_of_code_2025/util/InputMangler.java index 4202c27..8e4c73b 100644 --- a/src/main/java/de/advent_of_code_2025/util/InputMangler.java +++ b/src/main/java/de/advent_of_code_2025/util/InputMangler.java @@ -1,6 +1,7 @@ package de.advent_of_code_2025.util; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @@ -27,4 +28,10 @@ public class InputMangler { return retVal; } + + public static final List mangleSingle(String input, String mangleString) { + final List retVal = new ArrayList<>(); + + return Arrays.asList(input.split(mangleString)); + } } diff --git a/src/main/java/de/advent_of_code_2025/util/InputReader.java b/src/main/java/de/advent_of_code_2025/util/InputReader.java index 64e2f2d..496ee02 100644 --- a/src/main/java/de/advent_of_code_2025/util/InputReader.java +++ b/src/main/java/de/advent_of_code_2025/util/InputReader.java @@ -10,4 +10,9 @@ public class InputReader { final String fileName = args[0]; return Files.readAllLines(Paths.get(fileName)); } + + public static final String readSingle(String[] args) throws IOException { + final String fileName = args[0]; + return Files.readAllLines(Paths.get(fileName)).get(0); + } } diff --git a/src/main/resources/two/input.txt b/src/main/resources/two/input.txt new file mode 100644 index 0000000..cab3ba9 --- /dev/null +++ b/src/main/resources/two/input.txt @@ -0,0 +1 @@ +199617-254904,7682367-7856444,17408-29412,963327-1033194,938910234-938964425,3207382-3304990,41-84,61624-105999,1767652-1918117,492-749,85-138,140-312,2134671254-2134761843,2-23,3173-5046,16114461-16235585,3333262094-3333392446,779370-814446,26-40,322284296-322362264,6841-12127,290497-323377,33360-53373,823429-900127,17753097-17904108,841813413-841862326,518858-577234,654979-674741,773-1229,2981707238-2981748769,383534-468118,587535-654644,1531-2363 \ No newline at end of file diff --git a/src/main/resources/two/input_example.txt b/src/main/resources/two/input_example.txt new file mode 100644 index 0000000..bd04584 --- /dev/null +++ b/src/main/resources/two/input_example.txt @@ -0,0 +1 @@ +11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124 \ No newline at end of file