@@ -28,7 +28,7 @@ public void parseInput(List<String> input) {
28
28
firstInputPart = false ;
29
29
continue ;
30
30
}
31
- // LOGGER.debug ("Line: {}", s);
31
+ LOGGER .trace ("Line: {}" , s );
32
32
String [] split = s .split ("\\ |" );
33
33
List <String > currentRule = rules .getOrDefault (split [0 ], new ArrayList <>());
34
34
currentRule .add (split [1 ]);
@@ -37,19 +37,21 @@ public void parseInput(List<String> input) {
37
37
String [] split = s .split ("," );
38
38
allPages .add (Arrays .stream (split ).toList ());
39
39
}
40
-
41
40
}
42
- }
43
41
44
- public long solvePart1 () {
45
42
LOGGER .info ("Rules: {}" , rules );
46
43
LOGGER .info ("All pages: {}" , allPages );
47
44
45
+ }
46
+
47
+ public long solvePart1 () {
48
+
48
49
long sum = 0 ;
49
50
for (List <String > pageList : allPages ) {
50
- if (isInOrder (pageList )) {
51
+ List <List <String >> partialOrder = calculatePartialOrder (pageList );
52
+ if (isInOrder (pageList , partialOrder )) {
51
53
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 );
53
55
sum += Long .parseLong (middlePage );
54
56
}
55
57
}
@@ -58,91 +60,28 @@ public long solvePart1() {
58
60
return sum ;
59
61
}
60
62
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 ) {
103
64
104
65
int currentLevel = 0 ;
105
66
for (String p : pageList ) {
106
67
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 ));
108
69
currentLevel ++;
109
70
if (currentLevel > partialOrder .size () - 1 ) {
110
71
LOGGER .info ("{} are NOT ordered" , pageList );
111
- LOGGER .info (" current level {} and partialOrder {}" , currentLevel , partialOrder );
72
+ LOGGER .debug (" current level {} and partialOrder {}" , currentLevel , partialOrder );
112
73
113
74
return false ;
114
75
}
115
76
}
116
77
117
78
}
118
79
119
- LOGGER .info ("{} are ordered" , pageList );
80
+ LOGGER .debug ("{} are ordered" , pageList );
120
81
return true ;
121
82
}
122
83
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 ) {
146
85
Map <String , Integer > inEdgeCount = pageList .stream ().collect (Collectors .toMap (Function .identity (), (x ) -> 0 ));
147
86
for (String p : rules .keySet ()) {
148
87
for (String v : rules .get (p )) {
@@ -151,7 +90,7 @@ private List<String> orderList(List<String> pageList) {
151
90
}
152
91
}
153
92
}
154
- LOGGER .info ("The pages {} have this inEdgeCount: {}" , pageList , inEdgeCount );
93
+ LOGGER .debug ("The pages {} have this inEdgeCount: {}" , pageList , inEdgeCount );
155
94
List <String > firstElements = inEdgeCount .entrySet ().stream ()
156
95
.filter (e -> e .getValue () == 0 )
157
96
.map (Map .Entry ::getKey )
@@ -184,8 +123,25 @@ private List<String> orderList(List<String> pageList) {
184
123
}
185
124
}
186
125
}
187
- ArrayList <String > unordered = new ArrayList <>(pageList );
188
- return partialOrder .stream ().flatMap (x -> x .stream ()).toList ();
126
+ return partialOrder ;
127
+ }
128
+
189
129
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 ;
190
145
}
146
+
191
147
}
0 commit comments