Day 2
This commit is contained in:
122
src/main/java/de/advent_of_code_2025/two/Main.java
Normal file
122
src/main/java/de/advent_of_code_2025/two/Main.java
Normal file
@@ -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<Long> 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<Long> digits) {
|
||||
return String.valueOf(digits.getFirst()).repeat(digits.size()).equals(nString);
|
||||
}
|
||||
|
||||
private static final boolean hasSequence(String nString, List<Long> 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<Long> digits = getDigits(n);
|
||||
|
||||
if(digits.size() % 2 > 0) { // odd digit numbers not relevant
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Long> half = digits.subList(0, digits.size() / 2);
|
||||
|
||||
return digits.subList(digits.size() / 2, digits.size()).equals(half);
|
||||
}
|
||||
|
||||
private static final List<Long> getDigits(long n) {
|
||||
final List<Long> 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<String> lines = InputMangler.mangleSingle(line, ",");
|
||||
final List<IdRange> 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<IdRange> setupRanges(List<String> 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());
|
||||
}
|
||||
}
|
||||
@@ -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<String> mangleSingle(String input, String mangleString) {
|
||||
final List<String> retVal = new ArrayList<>();
|
||||
|
||||
return Arrays.asList(input.split(mangleString));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
1
src/main/resources/two/input.txt
Normal file
1
src/main/resources/two/input.txt
Normal file
@@ -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
|
||||
1
src/main/resources/two/input_example.txt
Normal file
1
src/main/resources/two/input_example.txt
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user