package Ġa oc 2 0 2 1 Ċ Ċ import Ġa oc 2 0 2 1 . utils . load Input Ċ import Ġjava . util .* Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġ// Ġpart Ġ 1 ĊĠĠĠ Ġval Ġlines Ġ= Ġload Input ("/ 2 0 2 1 / day 3 ") ĊĠĠĠĠĠĠĠ Ġ. buffered Reader () ĊĠĠĠĠĠĠĠ Ġ. read Lines () ĊĊĠĠĠ Ġfun Ġadd ( count : ĠList < Int >, Ġline : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġcount . zip ( line . toCharArray (). map Ġ{ Ġit . digit ToInt () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ+ Ġit . second Ġ} ĊĊĠĠĠ Ġval Ġcounts Ġ= Ġ Ġlines ĊĠĠĠĠĠĠĠ Ġ. fold ( Collections . n Cop ies ( 1 2 , Ġ 0 ), Ġ:: add ) ĊĊĠĠĠ Ġval Ġgamma Ġ= Ġcounts ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġif Ġ( it Ġ> Ġlines . size Ġ/ Ġ 2 ) Ġ' 1 ' Ġelse Ġ' 0 ' Ġ} ĊĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ"") ĊĠĠĠĠĠĠĠ Ġ. to BigInteger ( 2 ) ĊĊĠĠĠ Ġval Ġepsilon Ġ= Ġcounts ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġif Ġ( it Ġ> Ġlines . size Ġ/ Ġ 2 ) Ġ' 0 ' Ġelse Ġ' 1 ' Ġ} ĊĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ"") ĊĠĠĠĠĠĠĠ Ġ. to BigInteger ( 2 ) ĊĊĠĠĠ Ġprintln (" gamma : Ġ$ gamma ") ĊĠĠĠ Ġprintln (" epsilon : Ġ$ epsilon ") ĊĠĠĠ Ġprintln (" power : Ġ${ gamma Ġ* Ġepsilon }") ĊĊĠĠĠ Ġ// Ġpart Ġ 2 ĊĠĠĠ Ġfun Ġo xygen Rating ( nums : ĠList < String >) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( nums . partition Ġ{ Ġit . first () Ġ== Ġ' 1 ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ Ġfirst . size Ġ>= Ġsecond . size Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' 1 ' ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' ĊĊĠĠĠ Ġfun Ġcarbon Rating ( nums : ĠList < String >) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( nums . partition Ġ{ Ġit . first () Ġ== Ġ' 0 ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ Ġfirst . size Ġ<= Ġsecond . size Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' 1 ' ĊĊĠĠĠ Ġfun Ġrating Seq ( rating Method : Ġ( List < String >) Ġ-> ĠChar ) Ġ Ġ= ĊĠĠĠ Ġgenerate Sequence ( lines . filter For Rating ( rating Method )) Ġ{ Ġ(_, Ġpass , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( pass . size Ġ> Ġ 1 ) Ġpass . filter For Rating ( rating Method ) ĊĠĠĠĠĠĠĠ Ġelse Ġpass . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġlast Num Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Num . first OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFilter Result ( it , ĠlistOf ( last Num . substring ( 1 )), Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrating ( rating Method : Ġ( List < String >) Ġ-> ĠChar ) Ġ= ĊĠĠĠĠĠĠĠ Ġrating Seq ( rating Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . bit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt ( 2 ) ĊĊĠĠĠ Ġval Ġo xygen Ġ= Ġrating (:: oxy gen Rating ) ĊĠĠĠ Ġval Ġcarbon Ġ= Ġrating (:: carbon Rating ) ĊĊĠĠĠ Ġprintln (" oxy gen : Ġ$ oxy gen ") ĊĠĠĠ Ġprintln (" carbon : Ġ$ carbon ") ĊĠĠĠ Ġprintln (" life Ġsupport : Ġ${ oxy gen Ġ* Ġcarbon }") Ċ Ċ } Ċ Ċ data Ġclass ĠFilter Result ( val Ġbit : ĠChar , Ġval Ġpass : ĠList < String >, Ġval Ġfail : ĠList < String >) Ċ fun ĠFilter Result . get ( i : ĠChar ): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( i Ġ== Ġbit ) Ġpass Ġelse Ġfail Ċ } Ċ Ċ fun ĠList < String >. filter For Rating ( rating Method : Ġ( List < String >) Ġ-> ĠChar ): ĠFilter Result Ġ{ ĊĠĠĠ Ġval Ġbit Ġ= Ġrating Method ( this ) ĊĠĠĠ Ġval Ġ( pass , Ġfail ) Ġ= Ġthis . partition Ġ{ Ġit . first () Ġ== Ġbit Ġ} ĊĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst . map Ġ{ Ġit . substring ( 1 ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond . map Ġ{ Ġit . substring ( 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠFilter Result ( ĊĠĠĠĠĠĠĠ Ġbit , ĊĠĠĠĠĠĠĠ Ġpass , ĊĠĠĠĠĠĠĠ Ġfail ĊĠĠĠ Ġ) Ċ } ĊĊĊ