package Ġpl . sh ock ah . a oc . y 2 0 2 1 Ċ Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġpl . sh ock ah . a oc . Ad vent Task Ċ import Ġpl . sh ock ah . un ik orn . collection . Array 2 D Ċ import Ġpl . sh ock ah . un ik orn . collection . take Rows Ċ Ċ class ĠDay 3 : ĠAd vent Task < Array 2 D < Boolean >, ĠInt , ĠLong >( 2 0 2 1 , Ġ 3 ) Ġ{ Ċ ĉ override Ġfun Ġparse Input ( raw Input : ĠString ): ĠArray 2 D < Boolean > Ġ{ Ċĉ ĉ val Ġlines Ġ= Ġraw Input . lines () Ċĉ ĉ return ĠArray 2 D ( lines [ 0 ]. length , Ġlines . size ) Ġ{ Ġx , Ġy Ġ-> Ġlines [ y ][ x ] Ġ== Ġ' 1 ' Ġ} Ċ ĉ } ĊĊ ĉ override Ġfun Ġpart 1 ( input : ĠArray 2 D < Boolean >): ĠInt Ġ{ Ċĉ ĉ val Ġmost Common Bits Ġ= Ġ( 0 Ġuntil Ġinput . width ) Ċĉĉ ĉ . map Ġ{ Ġx Ġ-> Ċĉĉĉ ĉ ( 0 Ġuntil Ġinput . height ) Ċĉĉĉĉ ĉ . as Sequence () Ċĉĉĉĉ ĉ . map Ġ{ Ġy Ġ-> Ġinput [ x , Ġy ] Ġ} Ċĉĉĉĉ ĉ . groupBy Ġ{ Ġit Ġ} Ċĉĉĉĉ ĉ . map Ġ{ Ġit . value Ġ} Ċĉĉĉĉ ĉ . sorted By Descending Ġ{ Ġit . size Ġ} Ċĉĉĉĉ ĉ . map Ġ{ Ġit . first () Ġ} Ċĉĉĉĉ ĉ . first () Ċĉĉ ĉ } Ċĉ ĉ val Ġgamma Rate Ġ= Ġmost Common Bits . join ToString ("") Ġ{ Ġif Ġ( it ) Ġ" 1 " Ġelse Ġ" 0 " Ġ}. toInt ( 2 ) Ċĉ ĉ val Ġepsilon Rate Ġ= Ġ( 1 Ġshl Ġinput . width ) Ġ- Ġgamma Rate Ġ- Ġ 1 Ċĉ ĉ return Ġgamma Rate Ġ* Ġepsilon Rate Ċ ĉ } ĊĊ ĉ override Ġfun Ġpart 2 ( input : ĠArray 2 D < Boolean >): ĠLong Ġ{ Ċĉ ĉ fun Ġget Common Bit ( index : ĠInt , Ġvalues : ĠArray 2 D < Boolean >, Ġascending : ĠBoolean , Ġon Equal : ĠBoolean ): ĠBoolean Ġ{ Ċĉĉ ĉ val Ġun sorted Ġ= Ġvalues Ċĉĉĉ ĉ . getColumn ( index ) Ċĉĉĉ ĉ . groupBy Ġ{ Ġit Ġ} Ċĉĉĉ ĉ . map Ġ{ Ġit . value Ġ} Ċĉĉ ĉ if Ġ( un sorted . size Ġ== Ġ 2 Ġ&& Ġun sorted [ 0 ]. size Ġ== Ġun sorted [ 1 ]. size ) Ċĉĉĉ ĉ return Ġon Equal Ċĉĉ ĉ val Ġsorted Ġ= Ġif Ġ( ascending ) Ġun sorted . sorted By Ġ{ Ġit . size Ġ} Ġelse Ġun sorted . sorted By Descending Ġ{ Ġit . size Ġ} Ċĉĉ ĉ return Ġsorted Ċĉĉĉ ĉ . map Ġ{ Ġit . first () Ġ} Ċĉĉĉ ĉ . first () Ċĉ ĉ } ĊĊĉ ĉ var Ġcurrent 1 Ġ= Ġinput Ċĉ ĉ var Ġcurrent 2 Ġ= Ġinput Ċĉ ĉ for Ġ( index Ġin Ġ 0 Ġuntil Ġinput . width ) Ġ{ Ċĉĉ ĉ val Ġmost Common Bit Ġ= Ġget Common Bit ( index , Ġcurrent 1 , Ġfalse , Ġon Equal Ġ= Ġtrue ) Ċĉĉ ĉ val Ġleast Common Bit Ġ= Ġget Common Bit ( index , Ġcurrent 2 , Ġtrue , Ġon Equal Ġ= Ġfalse ) Ċĉĉ ĉ current 1 Ġ= Ġif Ġ( current 1 . height Ġ> Ġ 1 ) Ġcurrent 1 . take Rows Ġ{ Ġit [ index ] Ġ== Ġmost Common Bit Ġ} Ġelse Ġcurrent 1 Ċĉĉ ĉ current 2 Ġ= Ġif Ġ( current 2 . height Ġ> Ġ 1 ) Ġcurrent 2 . take Rows Ġ{ Ġit [ index ] Ġ== Ġleast Common Bit Ġ} Ġelse Ġcurrent 2 Ċĉ ĉ } ĊĊĉ ĉ val Ġo xygen Rating Ġ= Ġcurrent 1 . getRow ( 0 ). join ToString ("") Ġ{ Ġif Ġ( it ) Ġ" 1 " Ġelse Ġ" 0 " Ġ}. toInt ( 2 ) Ċĉ ĉ val Ġscr ub ber Rating Ġ= Ġcurrent 2 . getRow ( 0 ). join ToString ("") Ġ{ Ġif Ġ( it ) Ġ" 1 " Ġelse Ġ" 0 " Ġ}. toInt ( 2 ) Ċĉ ĉ return Ġo xygen Rating . to Long () Ġ* Ġscr ub ber Rating . to Long () Ċ ĉ } ĊĊ ĉ class ĠTests Ġ{ Ċĉ ĉ private Ġval Ġtask Ġ= ĠDay 3 () ĊĊĉ ĉ private Ġval Ġraw Input Ġ= Ġ""" Ċĉĉĉ 0 0 1 0 0 Ċĉĉĉ 1 1 1 1 0 Ċĉĉĉ 1 0 1 1 0 Ċĉĉĉ 1 0 1 1 1 Ċĉĉĉ 1 0 1 0 1 Ċĉĉĉ 0 1 1 1 1 Ċĉĉĉ 0 0 1 1 1 Ċĉĉĉ 1 1 1 0 0 Ċĉĉĉ 1 0 0 0 0 Ċĉĉĉ 1 1 0 0 1 Ċĉĉĉ 0 0 0 1 0 Ċĉĉĉ 0 1 0 1 0 Ċĉ ĉ """. trim Indent () ĊĊĉ ĉ @ Test Ċĉ ĉ fun Ġpart 1 () Ġ{ Ċĉĉ ĉ val Ġinput Ġ= Ġtask . parse Input ( raw Input ) Ċĉĉ ĉ Assertions . assertEquals ( 1 9 8 , Ġtask . part 1 ( input )) Ċĉ ĉ } ĊĊĉ ĉ @ Test Ċĉ ĉ fun Ġpart 2 () Ġ{ Ċĉĉ ĉ val Ġinput Ġ= Ġtask . parse Input ( raw Input ) Ċĉĉ ĉ Assertions . assertEquals ( 2 3 0 , Ġtask . part 2 ( input )) Ċĉ ĉ } Ċ ĉ } Ċ }