@@ -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