fun Ġmain () Ġ{ ĊĊĠĠĠ Ġfun Ġcount Bits ( input : ĠIterable < String >): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Bit Counts Ġ= ĠInt Array ( input . first (). length ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . toCharArray (). forEach Indexed Ġ{ Ġindex , Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ' 1 ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bit Counts [ index ] ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġset Bit Counts ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 1 ( input : ĠList < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Bit Counts Ġ= Ġcount Bits ( input ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgamma Ġ= Ġset Bit Counts . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ> Ġinput . size Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 1 ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. join ToString ("") ĊĠĠĠĠĠĠĠ Ġval Ġepsilon Ġ= Ġgamma . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 1 ' Ġ-> Ġ' 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' Ġ-> Ġ' 1 ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. join ToString ("") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠInteger . parseInt ( gamma , Ġ 2 ) Ġ* ĠInteger . parseInt ( epsilon , Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 ( input : ĠList < String >): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcandidates O xygen Ġ= Ġinput . to Mutable Set () ĊĠĠĠĠĠĠĠ Ġval Ġcandidates Sc rub ber Ġ= Ġinput . to Mutable Set () ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġinput . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidates O xygen . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Bit Counts Ġ= Ġcount Bits ( candidates O xygen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesired Bit Ġ= Ġif ( set Bit Counts [ i ]. toFloat () Ġ/ Ġcandidates O xygen . size . toFloat () Ġ>= Ġ 0 . 5 f ) Ġ' 1 ' Ġelse Ġ' 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidates O xygen . retain All Ġ{ Ġit [ i ] Ġ== Ġdesired Bit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidates Sc rub ber . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Bit Counts Ġ= Ġcount Bits ( candidates Sc rub ber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesired Bit Ġ= Ġif ( set Bit Counts [ i ]. toFloat () Ġ/ Ġcandidates Sc rub ber . size . toFloat () Ġ< Ġ 0 . 5 f ) Ġ' 1 ' Ġelse Ġ' 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidates Sc rub ber . retain All Ġ{ Ġit [ i ] Ġ== Ġdesired Bit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġo xy Ġ= Ġcandidates O xygen . also Ġ{ Ġcheck ( it . size Ġ== Ġ 1 )}. first (). toInt ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġscr Ġ= Ġcandidates Sc rub ber . also Ġ{ Ġcheck ( it . size Ġ== Ġ 1 )}. first (). toInt ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġo xy Ġ* Ġscr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtest Ġif Ġimplementation Ġme ets Ġcriteria Ġfrom Ġthe Ġdescription , Ġlike : ĊĠĠĠ Ġval Ġtest Input Ġ= Ġread Input (" Day 0 3 _ test ") ĊĠĠĠ Ġval Ġtest Output 1 Ġ= Ġpart 1 ( test Input ) ĊĠĠĠ Ġprintln (" test Ġoutput : Ġ$ test Output 1 ") ĊĠĠĠ Ġcheck ( test Output 1 Ġ== Ġ 1 9 8 ) ĊĠĠĠ Ġval Ġtest Output 2 Ġ= Ġpart 2 ( test Input ) ĊĠĠĠ Ġprintln (" test Ġoutput : Ġ$ test Output 2 ") ĊĠĠĠ Ġcheck ( test Output 2 Ġ== Ġ 2 3 0 ) ĊĊĠĠĠ Ġval Ġinput Ġ= Ġread Input (" Day 0 3 ") ĊĠĠĠ Ġprintln (" output Ġpart 1 : Ġ${ part 1 ( input )} ") ĊĠĠĠ Ġprintln (" output Ġpart 2 : Ġ${ part 2 ( input )} ") Ċ } Ċ