enum Ġclass ĠPacket Type ( val Ġid : ĠInt ) Ġ{ ĊĠĠĠ ĠSUM ( 0 ), ĊĠĠĠ ĠPRODUCT ( 1 ), ĊĠĠĠ ĠMIN IMUM ( 2 ), ĊĠĠĠ ĠMAX IMUM ( 3 ), ĊĠĠĠ ĠL ITERAL ( 4 ), ĊĠĠĠ ĠG RE ATER _ THAN ( 5 ), ĊĠĠĠ ĠL ESS _ THAN ( 6 ), ĊĠĠĠ ĠEQUAL S ( 7 ), Ċ } Ċ Ċ class ĠBit Stream ( private Ġval Ġchars : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠRAD IX : ĠInt Ġ= Ġ 1 6 ĊĠĠĠ Ġprivate Ġval ĠB ITS _ PER _ CHAR Ġ= Ġ 4 ĊĠĠĠ Ġval Ġbits Ġ= Ġchars . as Sequence (). map Ġ{ ĊĠĠĠĠĠĠĠ Ġit . digit ToInt ( RAD IX ). run ( Integer :: to Binary String ). pad Start ( BITS _ PER _ CHAR , Ġ' 0 ') ĊĠĠĠ Ġ}. join ToString ("") ĊĠĠĠ Ġvar Ġposition : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġread ( count : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġbits . substring ( position Ġuntil Ġ( position Ġ+ Ġcount )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġposition Ġ+= Ġcount Ġ} Ċ } Ċ Ċ val Ġstream Ġ= ĠBit Stream ( readLine () !! ) Ċ var Ġpart 1 Ġ= Ġ 0 L Ċ Ċ fun ĠBit Stream . read Packet (): ĠLong Ġ{ ĊĠĠĠ Ġpart 1 Ġ+= Ġstream . read ( 3 ) ĊĠĠĠ Ġreturn Ġwhen Ġ( stream . read ( 3 )) Ġ{ ĊĠĠĠĠĠĠĠ ĠPacket Type . LITERAL . id Ġ-> Ġstream . read Literal () ĊĠĠĠĠĠĠĠ ĠPacket Type . SUM . id Ġ-> Ġstream . read Sub Packets (). sum Of Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ ĠPacket Type . PRODUCT . id Ġ-> Ġstream . read Sub Packets (). reduce ( Long :: times ) ĊĠĠĠĠĠĠĠ ĠPacket Type . MIN IMUM . id Ġ-> Ġstream . read Sub Packets (). min Of Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ ĠPacket Type . MAXIMUM . id Ġ-> Ġstream . read Sub Packets (). max Of Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ ĠPacket Type . GRE ATER _ THAN . id Ġ-> Ġstream . read Sub Packets (). compare Ġ{ Ġa , Ġb Ġ-> Ġa Ġ> Ġb Ġ} ĊĠĠĠĠĠĠĠ ĠPacket Type . LESS _ THAN . id Ġ-> Ġstream . read Sub Packets (). compare Ġ{ Ġa , Ġb Ġ-> Ġa Ġ< Ġb Ġ} ĊĠĠĠĠĠĠĠ ĠPacket Type . EQUAL S . id Ġ-> Ġstream . read Sub Packets (). compare Ġ{ Ġa , Ġb Ġ-> Ġa Ġ== Ġb Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠBit Stream . read Literal (): ĠLong Ġ{ ĊĠĠĠ Ġval Ġgroup Size Ġ= Ġ 4 ĊĠĠĠ Ġreturn Ġsequence Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Continue Ġ= Ġstream . read ( 1 ) Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( stream . read ( group Size )) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( should Continue ) ĊĠĠĠ Ġ}. fold ( 0 L ) Ġ{ Ġacc , Ġelt Ġ-> ĊĠĠĠĠĠĠĠ Ġacc Ġshl Ġgroup Size Ġor Ġelt . to Long () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠBit Stream . read Sub Packets (): ĠSequence < Long > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( stream . read ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Packets Length Ġ= Ġstream . read ( 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġstream . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( stream . position Ġ< Ġstart Ġ+ Ġsub Packets Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( stream . read Packet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġgenerate Sequence Ġ{ Ġstream . read Packet () Ġ}. take ( stream . read ( 1 1 )) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T Ġ: ĠComparable < T >> ĠSequence < T >. compare ( operator : Ġ( T , ĠT ) Ġ-> ĠBoolean ): ĠLong Ġ= ĊĠĠĠ Ġto List (). let Ġ{ Ġ( first , Ġsecond ) Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperator ( first , Ġsecond ) Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ val Ġpart 2 Ġ= Ġstream . read Packet () Ċ Ċ println (" part 1 : Ġ$ part 1 ") Ċ println (" part 2 : Ġ$ part 2 ") Ċ