import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠDay 1 6 Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` run Ġpart Ġ 0 1 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbits Ġ= Ġget Trans mission Bits () ĊĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġget Packet ( bits ). first ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 9 6 0 , Ġversion ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` run Ġpart Ġ 0 2 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbits Ġ= Ġget Trans mission Bits () ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget Packet ( bits ). second ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 3 0 1 9 2 6 7 8 2 5 6 0 , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Packet ( bits : ĠString , Ġidx : ĠInt Ġ= Ġ 0 ): ĠTrip le < Long , ĠLong , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġidx 1 Ġ= Ġidx ĊĊĠĠĠĠĠĠĠ Ġvar Ġversion Ġ= Ġget Version ( bits , Ġidx 1 ). also Ġ{ Ġidx 1 Ġ+= Ġit . second Ġ}. first ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= ĠgetType ( bits , Ġidx 1 ). also Ġ{ Ġidx 1 Ġ+= Ġit . second Ġ}. first ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( label Ġ!= Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexec Operation ( bits , Ġidx 1 , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ+= Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx 1 Ġ+= Ġit . third ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Literal ( bits , Ġidx 1 ). also Ġ{ Ġidx 1 Ġ+= Ġit . second Ġ}. first ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( version , Ġvalue , Ġidx 1 Ġ- Ġidx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Version ( bits : ĠString , Ġidx : ĠInt ) Ġ= Ġbits ĊĠĠĠĠĠĠĠ Ġ. substring ( idx Ġuntil Ġidx Ġ+ Ġ 3 ). to Long ( 2 ) Ġto Ġ 3 ĊĊĠĠĠ Ġprivate Ġfun ĠgetType ( bits : ĠString , Ġidx : ĠInt ) Ġ= Ġbits ĊĠĠĠĠĠĠĠ Ġ. substring ( idx Ġuntil Ġidx Ġ+ Ġ 3 ). toInt ( 2 ) Ġto Ġ 3 ĊĊĠĠĠ Ġprivate Ġfun Ġexec Operation ( bits : ĠString , Ġidx : ĠInt , Ġop : ĠInt ): ĠTrip le < Long , ĠLong , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġidx 1 Ġ= Ġidx ĊĠĠĠĠĠĠĠ Ġval Ġpackets Ġ= Ġmutable ListOf < Pair < Long , ĠLong >>() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( length Is NumberOf Bits , Ġlength , Ġ_) Ġ= Ġget Length ( bits , Ġidx 1 ). also Ġ{ Ġidx 1 Ġ+= Ġit . third Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( length Is NumberOf Bits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġidx 1 Ġ+ Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( idx 1 Ġ< Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackets Ġ+= Ġget Packet ( bits , Ġidx 1 ). also Ġ{ Ġidx 1 Ġ+= Ġit . third Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . first Ġto Ġit . second Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( length ) Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackets Ġ+= Ġget Packet ( bits , Ġidx 1 ). also Ġ{ Ġidx 1 Ġ+= Ġit . third Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . first Ġto Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġwhen Ġ( op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġpackets . sum Of Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġpackets . fold ( 1 L ) Ġ{ Ġacc , Ġit Ġ-> Ġacc Ġ* Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġpackets . min Of Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġpackets . max Of Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġif Ġ( packets . first (). second Ġ> Ġpackets . last (). second ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 Ġ-> Ġif Ġ( packets . first (). second Ġ< Ġpackets . last (). second ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 7 Ġ-> Ġif Ġ( packets . first (). second Ġ== Ġpackets . last (). second ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( value , Ġpackets . sum Of Ġ{ Ġit . first Ġ}, Ġidx 1 Ġ- Ġidx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Length ( bits : ĠString , Ġidx : ĠInt ): ĠTrip le < Boolean , ĠInt , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġif Ġ( bits [ idx ] Ġ== Ġ' 0 ') Ġ 1 6 Ġelse Ġ 1 2 ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbits [ idx ] Ġ== Ġ' 0 ', ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbits . substring ( idx Ġ+ Ġ 1 Ġuntil Ġidx Ġ+ Ġlength ). toInt ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlength ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Literal ( bits : ĠString , Ġidx : ĠInt ): ĠPair < Long , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġidx 1 Ġ= Ġidx ĊĠĠĠĠĠĠĠ Ġvar Ġliteral Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġvar Ġhas Next Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhile Ġ( hasNext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Next Ġ= Ġget Literal Group ( bits , Ġidx 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Ġ+= Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx 1 Ġ+= Ġit . third ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first ĊĊĠĠĠĠĠĠĠ Ġreturn Ġliteral . to Long ( 2 ) Ġto Ġidx 1 Ġ- Ġidx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Literal Group ( bits : ĠString , Ġidx : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġbits . substring ( idx Ġuntil Ġidx Ġ+ Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( it [ 0 ] Ġ== Ġ' 1 ', Ġit . substring ( 1 ), Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Trans mission Bits () Ġ= ĠUtil . getInput AsString (" day 1 6 - input . txt ") ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ. join ToString ("") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt ( 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. pad Start ( 4 , Ġ' 0 ') ĊĠĠĠĠĠĠĠ Ġ} Ċ }