import java.io.IOException; import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; class Solution { public static void main(String[] args) throws IOException { String contents = Files.readString(Path.of("input.txt")); String[] lines = contents.split("\n"); List galaxies = new ArrayList(); SortedSet xs = new TreeSet(); SortedSet ys = new TreeSet(); for (int x = 0; x < lines[0].length(); x++) { xs.add(x); } for (int y = 0; y < lines.length; y++) { ys.add(y); for (int x = 0; x < lines[y].length(); x++) { char c = lines[y].charAt(x); if (c == '#') { galaxies.add(new Galaxy(x, y)); ys.remove(y); xs.remove(x); } } } // Part 1 List galaxiesPart1 = expandSpaces(galaxies, xs, ys, 2); int sum1 = 0; for (Galaxy g1 : galaxiesPart1) { for (Galaxy g2 : galaxiesPart1) { sum1 += g1.distance(g2); } } System.out.println(String.format("Part 1: %d", sum1 / 2)); // Part 2 List galaxiesPart2 = expandSpaces(galaxies, xs, ys, 1000000); BigInteger sum2 = BigInteger.ZERO; for (Galaxy g1 : galaxiesPart2) { for (Galaxy g2 : galaxiesPart2) { int d = g1.distance(g2); sum2 = sum2.add(BigInteger.valueOf(d)); } } System.out.println(String.format("Part 2: %d", sum2.divide(BigInteger.TWO))); } private static List expandSpaces(Iterable galaxies, Iterable xs, Iterable ys, int times) { List newGalaxies = new ArrayList(); for (Galaxy g : galaxies) { int dx = 0; int dy = 0; for (Integer x : xs) { if (x < g.x) { dx += times - 1; } else { break; } } for (Integer y : ys) { if (y < g.y) { dy += times - 1; } else { break; } } newGalaxies.add(new Galaxy(g.x + dx, g.y + dy)); } return newGalaxies; } } class Galaxy { public int x; public int y; public Galaxy(int x, int y) { this.x = x; this.y = y; } public int distance(Galaxy other) { return Math.abs(other.x - x) + Math.abs(other.y - y); } }