Cześć
Robię zadanie ze strony AdventOfCode - link (Jak link nie wchodzi to: https://adventofcode.com/2016/day/12). Łatwiej będzie wrzucić link, bo tam jest cała treść zadania + kod źródłowy.
Problem jest taki, że wszystko mi pięknie i ładnie hula, ale wynik wyjściowy jest zły. Nie wiem ile powinno wyjść w rejestrze "a", mi wyrzuca po odpaleniu 45. Czy mógłby ktoś życzliwy sprawdzić, gdzie u mnie jest błąd? Próbowałem wielu rzeczy i wynik wychodzi ciągle ten sam, a jakiekolwiek zmiany w cofaniu/przerzuceniu do przodu iteracji zgodnie z ostatnią instrukcją wysypuje program, bo się nie kończy. Poniżej kod:
public static void main(String[] args) throws IOException {
List<String> code = Files.readAllLines(Paths.get("zadanie122016.txt"));
LinkedHashMap<String, BigInteger> map = new LinkedHashMap<>();
map.put("a", BigInteger.ZERO);
map.put("b", BigInteger.ZERO);
map.put("c", BigInteger.ZERO);
map.put("d", BigInteger.ZERO);
Pattern patternCPY = Pattern.compile("cpy");
Pattern patternINC = Pattern.compile("inc");
Pattern patternDEC = Pattern.compile("dec");
Pattern patternJNZ = Pattern.compile("jnz");
Pattern patternLetter = Pattern.compile("[a-z]");
for (int i = 0; i < code.size(); i++) {
Matcher matcherCPY = patternCPY.matcher(code.get(i));
Matcher matcherINC = patternINC.matcher(code.get(i));
Matcher matcherDEC = patternDEC.matcher(code.get(i));
Matcher matcherJNZ = patternJNZ.matcher(code.get(i));
String[] line = code.get(i).trim().split(" ");
Matcher matcherIsLetter = patternLetter.matcher(line[1]);
if (matcherCPY.find()) {
if (matcherIsLetter.matches()) {
BigInteger sum = map.get(line[2]).add(map.get(line[1]));
map.replace(line[2], sum);
// map.replace(line[2], map.get(line[1])); komentarz poniżej kodu
System.out.println(code.get(i));
} else {
BigInteger sum = map.get(line[2]).add(new BigInteger(line[1]));
map.replace(line[2], sum);
// map.replace(line[2], new BigInteger(line[1])); komentarz poniżej kodu
System.out.println(code.get(i));
}
} else if (matcherINC.find()) {
BigInteger sum = map.get(line[1]).add(BigInteger.ONE);
map.replace(line[1], sum);
System.out.println(code.get(i));
} else if (matcherDEC.find()) {
BigInteger sum = map.get(line[1]).subtract(BigInteger.ONE);
map.replace(line[1], sum);
System.out.println(code.get(i));
} else if (matcherJNZ.find()) {
if (matcherIsLetter.matches()) {
if (map.get(line[1]).signum() > 0) {
System.out.println(code.get(i));
i = i + (Integer.parseInt(line[2]));
}
} else {
if (!line[1].equals("0")) {
System.out.println(code.get(i));
i = i + (Integer.parseInt(line[2]));
}
}
}
}
System.out.println();
System.out.println(map.get("a"));
}
Tam, gdzie są komentarze to kwestia zamiany z poprzednim, bo nie jestem pewien czy autorowi tego zadania pisząc "copy" miał na myśli, aby dodać tą wartość do aktualnego rejestru czy ustawić rejest na taką wartość. Tak czy siak, czy zmienię czy nie, to ciągle w rejestrze "a" jest na koniec 45.
Będę bardzo wdzięczny za pomoc, bo to ważne zadanie, które muszę jak najszybciej oddać i na prawdę widzę, że to nie kwestia, że nie umiem tylko gdzieś zrobiłem "czeski" błąd.