/**
* Prüft, ob die Zahl an der angegebenen Koordinate einen validen Nachbarn hat (ein Symbol).
*/
private boolean numberHasNeighbors(int x, int y) {
for (int dx = x - 1; dx <= x+1; dx++) {
for (int dy = y - 1; dy <= y+1; dy++) {
if (dx < 0 || dy < 0 || dx >= inputLines.get(0).length() || dy >= inputLines.size()) {
continue;
}
char c = inputLines.get(dy).charAt(dx);
if (c != '.' && !Character.isDigit(c)) {
return true;
}
}
}
return false;
}
/**
* Gibt die letzte x-Koordinate der Zahl zurück.
*/
private int getEndOfNumber(int x, int y) {
String line = inputLines.get(y);
while(x < line.length() - 1 && Character.isDigit(line.charAt(x+1))) {
x++;
}
return x;
}
/**
* Eingabe: eine Koordinate
* Ausgabe: die gesamte Zahl, die sich möglicherweise auch
* links und rechts von dieser einen Koordinate versteckt.
*/
private int getFullNumber(int x, int y) {
String line = inputLines.get(y);
// geh zum rechten Ende der Zahl
int end = getEndOfNumber(x, y);
// gehe von rechts zurück bis zum Anfang der Zahl und setze sie dabei zusammen
int zahl = 0;
int stelle = 0;
while (end >= 0 && Character.isDigit(line.charAt(end))) {
zahl += Character.getNumericValue(line.charAt(end)) * Math.pow(10, stelle);
stelle++;
end--;
}
return zahl;
}
public int partOne() {
int summe = 0;
// y for line
for (int y = 0; y < inputLines.size(); y++) {
String line = inputLines.get(y);
// i for index
for (int x = 0; x < line.length(); x++) {
if (Character.isDigit(line.charAt(x)) && numberHasNeighbors(x, y)) {
int number = getFullNumber(x, y);
summe += number;
x = getEndOfNumber(x, y) + 1;
}
}
}
return summe;
}
private ArrayList<Integer> getAdjacentNumbers(int x, int y) {
ArrayList numbers = new ArrayList<Integer>();
for (int dy = y-1; dy <= y+1; dy++) {
for (int dx = x-1; dx <= x+1; dx++) {
if (dx < 0 || dy < 0 || dx >= inputLines.get(0).length() || dy >= inputLines.size()) {
continue;
}
String line = inputLines.get(dy);
if (Character.isDigit(line.charAt(dx))) {
numbers.add(getFullNumber(dx, dy));
dx = getEndOfNumber(dx, dy);
}
}
}
return numbers;
}
public int partTwo() {
int summe = 0;
for (int y = 0; y < inputLines.size(); y++) {
String line = inputLines.get(y);
for (int x = 0; x < line.length(); x++) {
if (line.charAt(x) == '*') {
ArrayList<Integer> numbers = getAdjacentNumbers(x, y);
if (numbers.size() == 2) {
summe += numbers.get(0) * numbers.get(1);
}
}
}
}
return summe;
}