package Ġcom . chr is wk . a oc .` 2 0 2 0 ` Ċ Ċ class ĠDay 1 Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Ġ= ĠDay 1 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumbers Ġ= Ġ" day 1 . txt ". file To Lines (). map Ġ{ Ġit . toInt () Ġ}. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday . part 1 ( numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday . part 2 ( numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday . part 2 By Combin ations ( numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Pair ( goal : ĠInt , Ġoptions : ĠSet < Int >): ĠPair < Int , Int >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoptions . map NotNull Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( options . contains ( goal - a )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġto Ġ( goal - a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. first OrNull () ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġfind Trip let ( goal : ĠInt , Ġoptions : Set < Int >): ĠTrip le < Int , ĠInt , ĠInt >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoptions . as Sequence (). map NotNull Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġfind Pair ( goal Ġ- Ġa , Ġoptions - a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( a , Ġpair . first , Ġpair . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. first OrNull () ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠfindBy Combin ations ( goal : ĠInt , Ġoptions : ĠList < Int >): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoptions . combin ations ( 3 ). first Ġ{ Ġ( a , b , c ) Ġ-> Ġa + b + c Ġ== Ġgoal Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġpart 1 ( numbers : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( a , b ) Ġ= Ġfind Pair ( 2 0 2 0 , Ġnumbers . to Sorted Set ()) !! ĊĠĠĠĠĠĠĠ Ġreturn Ġa * b ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 ( numbers : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Trip let ( 2 0 2 0 , Ġnumbers . to Sorted Set ()) ?. let Ġ{ Ġ( a , b , c ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa * b * c ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ 0 ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 By Combin ations ( numbers : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġans Ġ= ĠfindBy Combin ations ( 2 0 2 0 , Ġnumbers ) ĊĠĠĠĠĠĠĠ Ġreturn Ġans . fold ( 1 ) Ġ{ Ġacc , Ġe Ġ-> Ġacc * e Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġf mr Part One (): ĠInt Ġ= Ġf mr Find Target (" day 1 . txt ". file To Lines (). map Ġ{ Ġit . toInt () Ġ}, Ġ 2 0 2 0 ) !! ĊĊĠĠĠ Ġprivate Ġfun Ġf mr Find Target ( ex pen ces : ĠList < Int >, Ġtarget : ĠInt ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġex pen ces ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġex pen ces . contains ( target Ġ- Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ( target Ġ- Ġit ) Ġ* Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġf mr Part Two (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexp enses Ġ= Ġ" day 1 . txt ". file To Lines (). map Ġ{ Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexp enses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġf mr Find Target ( exp enses , Ġ 2 0 2 0 Ġ- Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Ġ{ Ġit . second Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . first Ġ* Ġit . second !! Ġ} ĊĠĠĠ Ġ} Ċ }