@@ -27,8 +27,8 @@ protected void runPartTwo(final Scanner in) {
2727 run (in , Day05 ::getAllFreshIngredientsCount );
2828 }
2929
30- private void run (final Scanner in , final ToLongFunction <Set <Range >> getPartIngredientCount ) {
31- final Set <Range > ranges = new HashSet <>();
30+ private void run (final Scanner in , final ToLongFunction <List <Range >> getPartIngredientCount ) {
31+ final List <Range > ranges = new ArrayList <>();
3232
3333 while (in .hasNextLine ()) {
3434 final String line = in .nextLine ();
@@ -44,7 +44,7 @@ private void run(final Scanner in, final ToLongFunction<Set<Range>> getPartIngre
4444 print (getPartIngredientCount .applyAsLong (ranges ));
4545 }
4646
47- private static ToLongFunction <Set <Range >> getAvailableFreshIngredientsCount (final Scanner in ) {
47+ private static ToLongFunction <List <Range >> getAvailableFreshIngredientsCount (final Scanner in ) {
4848 return ranges -> {
4949 long fresh = 0 ;
5050 while (in .hasNextLine ()) {
@@ -62,37 +62,25 @@ private static ToLongFunction<Set<Range>> getAvailableFreshIngredientsCount(fina
6262 };
6363 }
6464
65- private static long getAllFreshIngredientsCount (final Set <Range > ranges ) {
66- Set <Range > fresh = ranges ;
67- boolean merged = true ;
68- while (merged ) {
69- Set <Range > newFresh = new HashSet <>(fresh );
70- merged = false ;
71-
72- for (Range first : fresh ) {
73- for (Range second : fresh ) {
74- if (first != second && first .end >= second .start && first .end <= second .end ) {
75- merged = true ;
76- newFresh .remove (first );
77- newFresh .remove (second );
78- newFresh .add (new Range (Math .min (first .start , second .start ), second .end ));
79- break ;
80- }
81- }
65+ private static long getAllFreshIngredientsCount (final List <Range > ranges ) {
66+ ranges .sort (Comparator .comparing (Range ::start ));
8267
83- if (merged ) {
84- break ;
85- }
86- }
68+ final List <Range > merged = new ArrayList <>();
69+ Range current = ranges .get (0 );
8770
88- fresh = newFresh ;
89- }
71+ for ( int i = 1 ; i < ranges . size (); ++ i ) {
72+ final Range next = ranges . get ( i );
9073
91- long freshCount = 0 ;
92- for (Range range : fresh ) {
93- freshCount += range .end - range .start + 1 ;
74+ if (next .start <= current .end + 1 ) {
75+ current = new Range (current .start , Math .max (current .end , next .end ));
76+ } else {
77+ merged .add (current );
78+ current = next ;
79+ }
9480 }
95- return freshCount ;
81+ merged .add (current );
82+
83+ return merged .stream ().mapToLong (range -> range .end - range .start + 1 ).sum ();
9684 }
9785
9886 private record Range (long start , long end ) {}
0 commit comments