diff --git a/src/Problem2b.java b/src/Problem2b.java new file mode 100644 index 0000000..52e9268 --- /dev/null +++ b/src/Problem2b.java @@ -0,0 +1,87 @@ +package src; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class Problem2b { + + public static void main(String[] args) { + String filePath = "inputs/inputProblem2.txt"; + + try { + String input = readFileAsString(filePath); + List ranges = parseRanges(input); + long tally = solve(ranges); + System.out.println("Sum of invalid IDs: " + tally); + + } catch (IOException e) { + e.printStackTrace(); + } + } + public static long solve(List ranges) { + long sum = 0; + + for (long[] range : ranges) { + long start = range[0]; + long end = range[1]; + + for (long num = start; num <= end; num++) { + String numStr = String.valueOf(num); + int len = numStr.length(); + + boolean repeated = false; + + for (int prefixLen = 1; prefixLen <= len / 2; prefixLen++) { + if (len % prefixLen != 0) continue; + + String prefix = numStr.substring(0, prefixLen); + int times = len / prefixLen; + StringBuilder sb = new StringBuilder(); + for (int t = 0; t < times; t++) { + sb.append(prefix); + } + + if (sb.toString().equals(numStr)) { + repeated = true; + break; + } + } + + if (repeated) sum += num; + } + } + + return sum; + } + + public static String readFileAsString(String filePath) throws IOException { + StringBuilder sb = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + while ((line = reader.readLine()) != null) { + sb.append(line.trim()); + } + } + return sb.toString(); + } + + public static List parseRanges(String input) { + List result = new ArrayList<>(); + String[] ranges = input.split(","); + + for (String range : ranges) { + String[] parts = range.trim().split("-"); + if (parts.length != 2) { + throw new IllegalArgumentException("Invalid range: " + range); + } + long start = Long.parseLong(parts[0]); + long end = Long.parseLong(parts[1]); + result.add(new long[]{start, end}); + } + + return result; + } +} \ No newline at end of file