Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
faecher:informatik:oberstufe:java:aoc:aco2023:day19:start [21.12.2023 19:25] – angelegt Marco Kuemmel | faecher:informatik:oberstufe:java:aoc:aco2023:day19:start [22.12.2023 23:26] (aktuell) – Marco Kuemmel | ||
---|---|---|---|
Zeile 112: | Zeile 112: | ||
return summe; | return summe; | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | |||
+ | ===== Lösungsvorschlag Teil 2 ===== | ||
+ | * Gehe rückwärts vor: suche alle '' | ||
+ | |||
+ | ++++ Lösungsvorschlag Teil 2 | | ||
+ | <code java> | ||
+ | private ArrayList< | ||
+ | |||
+ | public long partTwo() { | ||
+ | workflow = new HashMap< | ||
+ | |||
+ | // lies nur die workflows ein | ||
+ | for (String line: inputLines) { | ||
+ | if (line.length() == 0) { | ||
+ | continue; | ||
+ | } else if (!line.startsWith(" | ||
+ | workflow.put(line.split(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Workflow start = workflow.get(" | ||
+ | allPaths = new ArrayList(); | ||
+ | ArrayList< | ||
+ | getPathsToA(start, | ||
+ | |||
+ | long ergebnis = 0; | ||
+ | for (ArrayList< | ||
+ | int[][] range = new int[4][2]; | ||
+ | for (int i = 0; i < 4; i++) { | ||
+ | range[i][0] = 1; | ||
+ | range[i][1] = 4000; | ||
+ | } | ||
+ | for (String[] r: p) { | ||
+ | int comp; | ||
+ | if (r[1].equals(">" | ||
+ | range[Integer.parseInt(r[0])][0] = Integer.parseInt(r[2]); | ||
+ | } else if (r[1].equals("<" | ||
+ | range[Integer.parseInt(r[0])][1] = Integer.parseInt(r[2]); | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | long teilergebnis = 1; | ||
+ | for (int i = 0; i < 4; i++) { | ||
+ | teilergebnis *= range[i][1] - range[i][0] + 1; | ||
+ | } | ||
+ | ergebnis += teilergebnis; | ||
+ | } | ||
+ | |||
+ | return ergebnis; | ||
+ | } | ||
+ | |||
+ | private void getPathsToA(Workflow w, int step, ArrayList< | ||
+ | | ||
+ | if (step >= w.getSteps().size()) { | ||
+ | String nachfolger = w.getOtherwise(); | ||
+ | if (nachfolger.equals(" | ||
+ | allPaths.add(path); | ||
+ | } else if (nachfolger.equals(" | ||
+ | // do nothing | ||
+ | } else { | ||
+ | getPathsToA(workflow.get(nachfolger), | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | String[] stepX = w.getSteps().get(step); | ||
+ | |||
+ | // annahme, es sei false -> gehe zum nächsten step | ||
+ | ArrayList< | ||
+ | // | ||
+ | if (stepX[1].equals("<" | ||
+ | p1.add(new String[]{stepX[0], | ||
+ | } else if (stepX[1].equals(">" | ||
+ | p1.add(new String[]{stepX[0], | ||
+ | } | ||
+ | getPathsToA(w, | ||
+ | |||
+ | // annahme, es sei true -> gehe zum neuen workflow | ||
+ | if (stepX[1].equals("<" | ||
+ | path.add(new String[]{stepX[0], | ||
+ | } else if (stepX[1].equals(">" | ||
+ | path.add(new String[]{stepX[0], | ||
+ | } | ||
+ | if (stepX[3].equals(" | ||
+ | allPaths.add(path); | ||
+ | return; | ||
+ | } else if (stepX[3].equals(" | ||
+ | return; | ||
+ | } | ||
+ | getPathsToA(workflow.get(stepX[3]), | ||
+ | |||
} | } | ||
</ | </ |