@@ -6,7 +6,7 @@ export async function part1(inputFile: string) {
66}
77
88export async function part2 ( inputFile : string ) {
9- return await day5 ( inputFile ) ;
9+ return await day5 ( inputFile , findTotalFreshIngredientCount ) ;
1010}
1111
1212type IdRange = { from : number ; to : number } ;
@@ -43,4 +43,58 @@ function findFreshIngredients(idRanges: IdRange[], ingredientIds: number[]): num
4343 }
4444 }
4545 return freshCount ;
46+ }
47+
48+ function findTotalFreshIngredientCount ( idRanges : IdRange [ ] , _ : number [ ] ) : number {
49+ let reduceRanges = true ;
50+ let idRangesCopy = idRanges . slice ( ) ;
51+
52+ while ( reduceRanges ) {
53+ reduceRanges = false ;
54+ for ( let i = 0 ; i < idRanges . length ; i ++ ) {
55+ const a = idRanges [ i ] ;
56+ for ( let j = i + 1 ; j < idRanges . length ; j ++ ) {
57+ const b = idRanges [ j ] ;
58+
59+ if ( a . from >= b . from && a . from <= b . to ) {
60+ reduceRanges = true ;
61+ idRangesCopy . splice ( j , 1 ) ;
62+ idRangesCopy . splice ( i , 1 ) ;
63+ if ( a . to >= b . to ) {
64+ idRangesCopy . push ( { from : b . from , to : a . to } ) ;
65+ }
66+ if ( b . to >= a . to ) {
67+ idRangesCopy . push ( { from : b . from , to : b . to } ) ;
68+ }
69+ break ;
70+ }
71+
72+ if ( a . to >= b . from && a . to <= b . to ) {
73+ reduceRanges = true ;
74+ idRangesCopy . splice ( j , 1 ) ;
75+ idRangesCopy . splice ( i , 1 ) ;
76+
77+ if ( a . from >= b . from ) {
78+ idRangesCopy . push ( { from : b . from , to : b . to } ) ;
79+ }
80+ if ( b . from >= a . from ) {
81+ idRangesCopy . push ( { from : a . from , to : b . to } ) ;
82+ }
83+ break ;
84+ }
85+ }
86+ if ( reduceRanges ) {
87+ break ;
88+ }
89+ }
90+
91+ idRanges = idRangesCopy . slice ( ) ;
92+ }
93+
94+ let freshCount = 0 ;
95+ idRanges . forEach ( idRange => {
96+ freshCount += ( idRange . to - idRange . from ) + 1 ;
97+ } )
98+
99+ return freshCount ;
46100}
0 commit comments