package Ġa oc 2 0 1 5 Ċ Ċ import Ġkotlin . math . max Ċ Ċ class ĠDay 1 5 ( input : ĠList < String >) Ġ{ ĊĊĠĠĠ Ġ// ĠList Ġof Ġingredients , Ġeach Ġentry Ġis Ġa Ġlist Ġof Ġparameters Ġdescribing Ġthe Ġingredient Ġ( last Ġis Ġcal ories ) ĊĠĠĠ Ġprivate Ġval Ġingredients Ġ= Ġparse Input ( input ) ĊĊĠĠĠ Ġprivate Ġfun Ġparse Input ( input : ĠList < String >): ĠList < List < Int >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . split (" Ġ"). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( it [ 2 ]. drop Last ( 1 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 4 ]. drop Last ( 1 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 6 ]. drop Last ( 1 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 8 ]. drop Last ( 1 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 1 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscore ( amount s : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscores Ġ= ĠMutable List ( 4 ) Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( property Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġingredient ) Ġin Ġingredients . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscores [ property ] Ġ+= Ġamounts [ index ] Ġ* Ġingredient [ property ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġscores ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġif Ġ( it Ġ< Ġ 0 ) Ġ 0 Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( 1 ) Ġ{ Ġtotal , Ġitem Ġ-> Ġitem Ġ* Ġtotal Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcal ories ( amount s : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġingredients . with Index (). fold ( 0 ) Ġ{ Ġtotal , Ġitem Ġ-> Ġtotal Ġ+ Ġamounts [ item . index ] Ġ* Ġitem . value . last () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġall Combin ations ( num : ĠInt , Ġcal or ie Limit : ĠBoolean Ġ= Ġfalse ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbest Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( num Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 .. 1 0 0 Ġ- Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġ 0 .. 1 0 0 Ġ- Ġi Ġ- Ġj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġamounts Ġ= ĠlistOf ( i , Ġj , Ġk , Ġ 1 0 0 Ġ- Ġi Ġ- Ġj Ġ- Ġk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cal or ie Limit Ġ|| Ġcal ories ( amount s ) Ġ== Ġ 5 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Ġ= Ġmax ( best , Ġscore ( amount s )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( num Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġamounts Ġ= ĠlistOf ( i , Ġ 1 0 0 Ġ- Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cal or ie Limit Ġ|| Ġcal ories ( amount s ) Ġ== Ġ 5 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Ġ= Ġmax ( best , Ġscore ( amount s )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve Part 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġall Combin ations ( ingredients . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsolve Part 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġall Combin ations ( ingredients . size , Ġtrue ) ĊĠĠĠ Ġ} Ċ }