package Ġcom . chr is wk . a oc . ad vent 2 0 2 1 Ċ Ċ import Ġcom . chr is wk . a oc . Ad vent Day Ċ import Ġcom . chr is wk . a oc . ad vent 2 0 2 1 . Day 5 . Companion . diff Ċ import Ġcom . chr is wk . a oc . util . report Ċ import Ġcom . chr is wk . a oc . util . report Nano Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġorg . apache . logging . log 4 j . Logger ĊĊ Ċ type alias ĠCr ab Ġ= ĠInt Ċ Ċ class ĠDay 7 : ĠAd vent Day ( 2 0 2 1 , Ġ 7 ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Ġ= ĠDay 7 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Nano Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday . part 1 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Nano Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday . part 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday . minimum Position Cost ( day . input Cr abs , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday . minimum Position Cost ( day . input Cr abs , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlogger : ĠLogger Ġ= ĠLog Manager . getLogger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinput Cr abs Ġ= Ġcr abs ( input AsString ) ĊĠĠĠ Ġval Ġcr ab Map Ġ= Ġinput Cr abs . grouping By Ġ{ Ġit Ġ}. each Count () ĊĊĠĠĠ Ġfun Ġcr abs ( input : ĠString ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . split ("," ). map Ġ{ Ġit . toInt () Ġ}. sorted () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġposition Cost s ( cr abs : ĠList < Cr ab >, Ġga uss Sum : ĠBoolean Ġ= Ġfalse ): ĠMap < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcr ab Map Ġ= Ġcr abs . grouping By Ġ{ Ġit Ġ}. each Count () ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġcr abs . first () ĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġcr abs . last () ĊĠĠĠĠĠĠĠ Ġreturn Ġ( min .. max ). map Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġto Ġ( cr ab Map . entries . fold ( 0 ) Ġ{ Ġa , Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġpos . diff ( e . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcost Ġ= Ġif Ġ( gauss Sum ) Ġ{ Ġga uss Distance ( distance ) Ġ} Ġelse Ġ{ Ġdistance Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ+ Ġ( cost Ġ* Ġe . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġminimum Position Cost ( cr abs : ĠList < Cr ab >, Ġga uss Sum : ĠBoolean Ġ= Ġfalse ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcr ab Map Ġ= Ġcr abs . grouping By Ġ{ Ġit Ġ}. each Count () ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġcr abs . first () ĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġcr abs . last () ĊĠĠĠĠĠĠĠ Ġreturn Ġ( min .. max ). min Of Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcr ab Map . entries . fold ( 0 ) Ġ{ Ġtotal Cost , Ġ( cr ab At , Ġcount ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġpos . diff ( cr ab At ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcost Ġ= Ġif Ġ( gauss Sum ) Ġ{ Ġga uss Distance ( distance ) Ġ} Ġelse Ġ{ Ġdistance Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Cost Ġ+ Ġ( cost Ġ* Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcost To Point ( point : ĠInt , Ġcr abs : ĠMap < Int , ĠInt >, Ġga uss Sum : ĠBoolean Ġ= Ġfalse ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcr abs . entries . sum Of Ġ{ Ġ( cr ab At , Ġcount ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġpoint . diff ( cr ab At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcost For One Ġ= Ġif Ġ( gauss Sum ) Ġ{ Ġga uss Distance ( distance ) Ġ} Ġelse Ġ{ Ġdistance Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcost For One Ġ* Ġcount ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtarget Part 1 ( cr abs : ĠList < Cr ab >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcr abs [ cr abs . size Ġ/ Ġ 2 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtarget Part 2 ( cr abs : ĠList < Cr ab >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcr abs . average (). toInt () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġga uss Distance ( distance : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( distance Ġ* Ġ( distance + 1 )) Ġ/ Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcost To Point ( target Part 1 ( input Cr abs ), Ġcr ab Map , Ġga uss Sum Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcost To Point ( target Part 2 ( input Cr abs ), Ġcr ab Map , Ġga uss Sum Ġ= Ġtrue ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ