Skip to content

Commit 404a9a6

Browse files
day05 for AoC 2023 (part 2) refactoring
Took 10 minutes
1 parent 617a14e commit 404a9a6

File tree

1 file changed

+33
-77
lines changed
  • src/main/java/aminetti/adventofcode2024/day05

1 file changed

+33
-77
lines changed

src/main/java/aminetti/adventofcode2024/day05/Day05.java

Lines changed: 33 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void parseInput(List<String> input) {
2828
firstInputPart = false;
2929
continue;
3030
}
31-
//LOGGER.debug("Line: {}", s);
31+
LOGGER.trace("Line: {}", s);
3232
String[] split = s.split("\\|");
3333
List<String> currentRule = rules.getOrDefault(split[0], new ArrayList<>());
3434
currentRule.add(split[1]);
@@ -37,19 +37,21 @@ public void parseInput(List<String> input) {
3737
String[] split = s.split(",");
3838
allPages.add(Arrays.stream(split).toList());
3939
}
40-
4140
}
42-
}
4341

44-
public long solvePart1() {
4542
LOGGER.info("Rules: {}", rules);
4643
LOGGER.info("All pages: {}", allPages);
4744

45+
}
46+
47+
public long solvePart1() {
48+
4849
long sum = 0;
4950
for (List<String> pageList : allPages) {
50-
if (isInOrder(pageList)) {
51+
List<List<String>> partialOrder = calculatePartialOrder(pageList);
52+
if (isInOrder(pageList, partialOrder)) {
5153
String middlePage = pageList.get(pageList.size() / 2);
52-
LOGGER.info("Found ordered page: {}; adding {} to the sum", pageList, middlePage);
54+
LOGGER.debug("Found ordered page: {}; adding {} to the sum", pageList, middlePage);
5355
sum += Long.parseLong(middlePage);
5456
}
5557
}
@@ -58,91 +60,28 @@ public long solvePart1() {
5860
return sum;
5961
}
6062

61-
private boolean isInOrder(List<String> pageList) {
62-
Map<String, Integer> inEdgeCount = pageList.stream().collect(Collectors.toMap(Function.identity(), (x) -> 0));
63-
for (String p : rules.keySet()) {
64-
for (String v : rules.get(p)) {
65-
if (pageList.contains(v) && pageList.contains(p)) {
66-
inEdgeCount.put(v, inEdgeCount.get(v) + 1);
67-
}
68-
}
69-
}
70-
LOGGER.info("The pages {} have this inEdgeCount: {}", pageList, inEdgeCount);
71-
List<String> firstElements = inEdgeCount.entrySet().stream()
72-
.filter(e -> e.getValue() == 0)
73-
.map(Map.Entry::getKey)
74-
.collect(Collectors.toList());
75-
76-
List<List<String>> partialOrder = new ArrayList<>();
77-
partialOrder.add(firstElements);
78-
79-
for (int i = 0; i < partialOrder.size(); i++) {
80-
List<String> level = partialOrder.get(i);
81-
if (level.isEmpty()) {
82-
break;
83-
}
84-
List<String> nextLevel = new ArrayList<>();
85-
partialOrder.add(nextLevel);
86-
for (String e : level) {
87-
if (!rules.containsKey(e)) {
88-
continue;
89-
}
90-
for (String v : rules.get(e)) {
91-
if (!pageList.contains(v)) {
92-
continue;
93-
}
94-
Integer inEdgesForV = inEdgeCount.get(v);
95-
inEdgesForV--;
96-
inEdgeCount.put(v, inEdgesForV);
97-
if (inEdgesForV == 0) {
98-
nextLevel.add(v);
99-
}
100-
}
101-
}
102-
}
63+
private boolean isInOrder(List<String> pageList, List<List<String>> partialOrder) {
10364

10465
int currentLevel = 0;
10566
for (String p : pageList) {
10667
while (!partialOrder.get(currentLevel).contains(p)) {
107-
LOGGER.info("{} is not in level [{}] {}, so switching to the next level", p, currentLevel, partialOrder.get(currentLevel));
68+
LOGGER.debug("{} is not in level [{}] {}, so switching to the next level", p, currentLevel, partialOrder.get(currentLevel));
10869
currentLevel++;
10970
if (currentLevel > partialOrder.size() - 1) {
11071
LOGGER.info("{} are NOT ordered", pageList);
111-
LOGGER.info(" current level {} and partialOrder {}", currentLevel, partialOrder);
72+
LOGGER.debug(" current level {} and partialOrder {}", currentLevel, partialOrder);
11273

11374
return false;
11475
}
11576
}
11677

11778
}
11879

119-
LOGGER.info("{} are ordered", pageList);
80+
LOGGER.debug("{} are ordered", pageList);
12081
return true;
12182
}
12283

123-
124-
public long solvePart2() {
125-
LOGGER.info("Rules: {}", rules);
126-
LOGGER.info("All pages: {}", allPages);
127-
128-
129-
List<List<String>> unOrderedLists = allPages.stream().filter(x -> !isInOrder(x)).collect(Collectors.toList());
130-
131-
long sum = 0;
132-
for (List<String> pageList : unOrderedLists) {
133-
LOGGER.info("Ordering {}", pageList);
134-
List<String> orderedList = orderList(pageList);
135-
String middlePage = orderedList.get(pageList.size() / 2);
136-
LOGGER.info("Ordered the list {} in this way {}; and the middle element is {}", pageList, orderedList, middlePage);
137-
sum += Long.parseLong(middlePage);
138-
139-
}
140-
141-
142-
return sum;
143-
}
144-
145-
private List<String> orderList(List<String> pageList) {
84+
private List<List<String>> calculatePartialOrder(List<String> pageList) {
14685
Map<String, Integer> inEdgeCount = pageList.stream().collect(Collectors.toMap(Function.identity(), (x) -> 0));
14786
for (String p : rules.keySet()) {
14887
for (String v : rules.get(p)) {
@@ -151,7 +90,7 @@ private List<String> orderList(List<String> pageList) {
15190
}
15291
}
15392
}
154-
LOGGER.info("The pages {} have this inEdgeCount: {}", pageList, inEdgeCount);
93+
LOGGER.debug("The pages {} have this inEdgeCount: {}", pageList, inEdgeCount);
15594
List<String> firstElements = inEdgeCount.entrySet().stream()
15695
.filter(e -> e.getValue() == 0)
15796
.map(Map.Entry::getKey)
@@ -184,8 +123,25 @@ private List<String> orderList(List<String> pageList) {
184123
}
185124
}
186125
}
187-
ArrayList<String> unordered = new ArrayList<>(pageList);
188-
return partialOrder.stream().flatMap(x -> x.stream()).toList();
126+
return partialOrder;
127+
}
128+
189129

130+
public long solvePart2() {
131+
long sum = 0;
132+
133+
for (List<String> pageList : allPages) {
134+
List<List<String>> partialOrder = calculatePartialOrder(pageList);
135+
if (isInOrder(pageList, partialOrder)) {
136+
continue;
137+
}
138+
LOGGER.info("Ordering {}", pageList);
139+
List<String> orderedList = partialOrder.stream().flatMap(Collection::stream).toList();
140+
String middlePage = orderedList.get(pageList.size() / 2);
141+
LOGGER.info(" ordered the list {} in this way {}; and the middle element is {}", pageList, orderedList, middlePage);
142+
sum += Long.parseLong(middlePage);
143+
}
144+
return sum;
190145
}
146+
191147
}

0 commit comments

Comments
 (0)