package Ġcommon Ċ Ċ import Ġcard . Card Ċ import Ġcard . Prime Or Sub Suit Ċ import Ġcard . Suit Ċ import Ġgame . Real Power Comparator Ċ Ċ data Ġclass ĠPri mes And Sub s ( ĊĠĠĠ Ġval Ġpri mes : ĠMutable List < Int >, ĊĠĠĠ Ġval Ġsubs : ĠMutable List < Int > Ċ ) Ċ Ċ fun ĠIterable < Int >. split To Pri mes And Sub s ( prime Suit : ĠS uit ?): ĠPri mes And Sub s Ġ{ ĊĠĠĠ Ġval Ġpri mes Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġval Ġsubs Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ ĠforEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . card . is Prime ( prime Suit )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpri mes . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubs . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠPri mes And Sub s ( pri mes , Ġsubs ) Ċ } Ċ Ċ // Ġassume Ġno Ġj oker Ċ fun ĠIterable < Int >. split To Four Su its (): ĠMutable List < Mutable List < Int >> Ġ{ ĊĠĠĠ Ġval Ġlist List Ġ= Ġmutable ListOf < Mutable List < Int >>() ĊĠĠĠ Ġrepeat ( 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist List . add ( mutable ListOf ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuit Idx Ġ= ĠS uit . values (). indexOf ( id . card . suit !! ) ĊĠĠĠĠĠĠĠ Ġlist List [ suit Idx ]. add ( id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlist List Ċ } Ċ Ċ fun ĠIterable < Int >. split To Prime Or Sub Suit Map ( prime Suit : ĠS uit ?): ĠMutable Map < Prime Or Sub Suit , ĠMutable Set < Int >> Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < Prime Or Sub Suit , ĠMutable Set < Int >>() ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcard Ġ= Ġid . card ĊĠĠĠĠĠĠĠ Ġval Ġprime Or Sub Suit Ġ= Ġcard . get Prime Or Sub Suit ( prime Suit ) ĊĠĠĠĠĠĠĠ Ġmap . get Or Put ( prime Or Sub Suit ) Ġ{ Ġmutable Set Of () Ġ}. add ( id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmap Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. get Other Items From Right To Left ( t : ĠT ): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġidx Ġ= ĠindexOf ( t ) ĊĠĠĠ Ġcheck ( idx Ġ>= Ġ 0 ) Ġ{ Ġ" item Ġis Ġnot Ġin Ġthe Ġlist " Ġ} ĊĠĠĠ Ġreturn Ġget Other Items From Right To Left ( idx ) Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. get Other Items From Right To Left ( idx : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < T >() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ( idx Ġ+ Ġ 1 ) Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . add ( get ( i )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġidx ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . add ( get ( i )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlist Ċ } Ċ Ċ fun ĠList < Int >. first Card (): ĠCard Ġ{ ĊĠĠĠ Ġcheck ( isNotEmpty ()) Ġ{ Ġ" list Ġis Ġempty " Ġ} ĊĠĠĠ Ġreturn Ġget ( 0 ). card Ċ } Ċ Ċ fun ĠIterable < Int >. any Id (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġfirst () Ċ } Ċ Ċ fun ĠIterable < Int >. any Card (): ĠCard Ġ{ ĊĠĠĠ Ġreturn Ġfirst (). card Ċ } Ċ Ċ val ĠSet < Int >. suit : ĠS uit ? ĊĠĠĠ Ġget () Ġ= Ġany Card (). suit Ċ Ċ fun Ġ< T > ĠList < T >. all Same (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( isEmpty ()) Ġreturn Ġtrue ĊĠĠĠ Ġreturn Ġall Ġ{ Ġit Ġ== Ġget ( 0 ) Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠSet < T >. copy (): ĠSet < T > Ġ= ĠHashSet ( this ) Ċ Ċ // Ġnot Ġreally Ġrandom ... Ċ fun Ġ< T > ĠSet < T >. random Sub Set ( size : ĠInt ): ĠSet < T > Ġ{ ĊĠĠĠ Ġcheck ( size Ġ<= Ġthis . size ) Ġ{ Ġ" size Ġtoo Ġbig " Ġ} ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < T >() ĊĠĠĠ Ġfor Ġ( t Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result . size Ġ== Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . add ( t ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. next Item ( t : ĠT ): ĠT ? Ġ{ ĊĠĠĠ Ġval Ġcur Idx Ġ= ĠindexOf ( t ) ĊĠĠĠ Ġcheck ( cur Idx Ġ>= Ġ 0 ) Ġ{ Ġ" index Ġout Ġof Ġbound " Ġ} ĊĠĠĠ Ġif Ġ( cur Idx Ġ== Ġsize Ġ- Ġ 1 ) Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġget ( cur Idx Ġ+ Ġ 1 ) Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. equals ToList ( other : ĠList < T >): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( size Ġ!= Ġother . size ) Ġreturn Ġfalse ĊĠĠĠ Ġfor Ġ(( idx , Ġ_) Ġin Ġthis . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this [ idx ] Ġ!= Ġother [ idx ]) Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠSet < Int >. all Same (): ĠBoolean Ġ{ ĊĠĠĠ Ġcheck ( size Ġ> Ġ 0 ) ĊĠĠĠ Ġreturn Ġmap Ġ{ Ġit . card . intrinsic Id Ġ}. distinct (). size Ġ== Ġ 1 Ċ } Ċ Ċ fun ĠSet < Int >. all Unique (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġset Ġ= Ġmap Ġ{ Ġit Ġ% Ġ 5 4 Ġ}. toSet () ĊĠĠĠ Ġreturn Ġsize Ġ== Ġset . size Ċ } Ċ Ċ fun ĠSet < Int >. to Intr insic Card Count Map (): ĠMap < Card , ĠInt > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Card , ĠInt >() ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcard Ġ= Ġid . card ĊĠĠĠĠĠĠĠ Ġif Ġ( result . containsKey ( card )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ card ] Ġ= Ġresult [ card ] !! Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ card ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠIterable < Int >. has Prime ( prime Suit : ĠS uit ?): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id . card . is Prime ( prime Suit )) Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ fun ĠIterable < Int >. has Non Prime ( prime Suit : ĠS uit ?): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! id . card . is Prime ( prime Suit )) Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ fun ĠIterable < Int >. has Non Flex ible Suit ( suit : ĠS uit ): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id . card . suit Ġ== Ġsuit Ġ&& Ġ! id . card . is Flex ible Prime ) Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ fun ĠIterable < Int >. all Are Non Flex ible Suit ( suit : ĠS uit ): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id . card . suit Ġ!= Ġsuit Ġ|| Ġid . card . is Flex ible Prime ) Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ data Ġclass ĠSplit ed Sets < T >( ĊĠĠĠ Ġval Ġmatched : ĠMutable Set < T >, ĊĠĠĠ Ġval Ġnot Matched : ĠMutable Set < T > Ċ ) Ċ Ċ fun Ġ< T > ĠIterable < T >. split With Predicate ( func : Ġ( T ) Ġ-> ĠBoolean ): ĠSplit ed Sets < T > Ġ{ ĊĠĠĠ Ġval Ġmatched : ĠMutable Set < T > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġval Ġnot Matched : ĠMutable Set < T > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġfor Ġ( i Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( func ( i )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatched . add ( i ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Matched . add ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠSplit ed Sets ( matched , Ġnot Matched ) Ċ } Ċ Ċ fun ĠIterable < Int >. sub Set Cards Are The Big gest ( sub Set : ĠIterable < Int >, Ġprime Suit : ĠS uit ?): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcomparator Ġ= ĠReal Power Comparator ( prime Suit ). reversed () ĊĠĠĠ Ġval Ġsorted Ġ= Ġsorted With ( comparator ) ĊĠĠĠ Ġval Ġsub Sorted Ġ= Ġsub Set . sorted With ( comparator ) ĊĠĠĠ Ġfor Ġ(( idx , Ġsub ) Ġin Ġsub Sorted . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( sub . card . get Real Power ( prime Suit ) Ġ!= Ġsorted [ idx ]. card . get Real Power ( prime Suit )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠIterable < Int >. is Same Width Same Prime Or Sub Suit Mult is ( prime Or Sub Suit : ĠPrime Or Sub Suit , Ġwidth : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcount Map Ġ= Ġmutable Map Of < Card , ĠInt >() ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcard Ġ= Ġid . card ĊĠĠĠĠĠĠĠ Ġif Ġ(! card . is Prime Or Sub Suit ( prime Or Sub Suit )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcount Map [ card ] Ġ= Ġcount Map . getOrElse ( card ) Ġ{ Ġ 0 Ġ} Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcount Map . all Ġ{ Ġit . value Ġ% Ġwidth Ġ== Ġ 0 Ġ} Ċ } Ċ Ċ fun Ġ< T , ĠC > ĠIterable < T >. find Any Same Sub Set ( ĊĠĠĠ Ġsize : ĠInt Ġ= ĠInt . MAX _ VALUE , ĊĠĠĠ Ġcompare e Getter : Ġ( T ) Ġ-> ĠC , ĊĠĠĠ Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ} Ċ ): ĠSet < T >? Ġ{ ĊĠĠĠ Ġval Ġmap : ĠMutable Map < C , ĠMutable Set < T >> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġfor Ġ( t Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! predicate ( t )) Ġcontinue ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġmap . get Or Put ( compare e Getter ( t )) Ġ{ Ġmutable Set Of () Ġ} ĊĠĠĠĠĠĠĠ Ġset . add ( t ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmost Ġ= Ġmap . entries . max By OrNull Ġ{ Ġit . value . size Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( most Ġ!= Ġnull Ġ&& Ġmost . value . size Ġ>= Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmost . value . random Sub Set ( size ) ĊĠĠĠ Ġ} Ġelse Ġnull Ċ } Ċ Ċ fun ĠIterable < Int >. getId Set Of Card ( card : ĠCard ): ĠSet < Int > Ġ{ ĊĠĠĠ Ġval Ġset Ġ= Ġmutable Set Of < Int >() ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ% Ġ 5 4 Ġ== Ġcard . intrinsic Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġset Ċ } Ċ Ċ fun ĠIterable < Int >. get Big gest Sub Set ( size : ĠInt , Ġprime Suit : ĠS uit ?): ĠSet < Int > Ġ{ ĊĠĠĠ Ġreturn Ġsorted With ( Real Power Comparator ( prime Suit ). reversed ()). sub List ( 0 , Ġsize ). toSet () Ċ } Ċ Ċ fun Ġ< T > ĠMutable Iterable < T >. remove Any (): ĠT ? Ġ{ ĊĠĠĠ Ġval Ġiterator Ġ= Ġiterator () ĊĠĠĠ Ġreturn Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠ Ġreturn Ġnext ĊĠĠĠ Ġ} Ġelse Ġnull Ċ } Ċ Ċ fun Ġ< T > ĠMutable Iterable < T >. remove If ( remove Predicate : Ġ( T ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġitr Ġ= Ġiterator () ĊĠĠĠ Ġwhile Ġ( itr . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġitr . next () ĊĠĠĠĠĠĠĠ Ġif Ġ( remove Predicate ( t )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitr . remove () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠIterable < Int >. to Cards String (): ĠString Ġ{ ĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠ Ġfor Ġ( id Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ( id . card ) ĊĠĠĠĠĠĠĠ Ġsb . append (", Ġ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġsb . delete At ( sb . length Ġ- Ġ 1 ) ĊĠĠĠ Ġsb . delete At ( sb . length Ġ- Ġ 1 ) ĊĠĠĠ Ġreturn Ġsb . toString () Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. get Right Item ( t : ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġidx Ġ= ĠindexOf ( t ) ĊĠĠĠ Ġreturn Ġif Ġ( idx Ġ== Ġsize Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget ( 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġget ( idx Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. get Left Item ( t : ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġidx Ġ= ĠindexOf ( t ) ĊĠĠĠ Ġreturn Ġif Ġ( idx Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget ( size Ġ- Ġ 1 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġget ( idx Ġ- Ġ 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. right Index ( idx : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( idx Ġ== Ġsize Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġidx Ġ+ Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠList < T >. get Relative Idx ( target : ĠT , Ġfirst : ĠT ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġfirst Idx Ġ= ĠindexOf ( first ) ĊĠĠĠ Ġvar Ġtarget Idx Ġ= Ġfirst Idx ĊĠĠĠ Ġwhile Ġ( get ( target Idx ) Ġ!= Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget Idx Ġ= Ġright Index ( target Idx ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtarget Idx Ċ }