package Ġcom . max pilot to . k rand . utils Ċ Ċ import Ġkotlin . random . Random Ċ Ċ class ĠP icker ( val Ġseed : ĠAny ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrng Ġ= ĠRandom ( seed . hashCode ()) ĊĊĠĠĠ Ġfun Ġ< T > Ġweighted ( items : ĠArray < T >, Ġweights : ĠIterable < Number >, Ġcount : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweighted ( items . toList (), Ġweights , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġweighted ( items : ĠMap < T , ĠNumber >, Ġcount : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweighted ( items . keys , Ġitems . values , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġweighted ( items : ĠIterable < T >, Ġweights : ĠIterable < Number >, Ġcount : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( items . count () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweighted ( items , Ġweights ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠV > Ġweighted ( map : ĠMap < K , ĠV >, Ġweights : ĠIterable < Number >, Ġcount : ĠInt ): ĠList < Map . Entry < K , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( map . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweighted ( map . entries , Ġweights ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġweighted ( weights : ĠIterable < Number >, Ġcount : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( T :: class . java . enum Constants . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweighted ( weights ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġweighted ( items : ĠArray < T >, Ġweights : ĠIterable < Number >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweighted ( items . toList (), Ġweights ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġweighted ( items : ĠMap < T , ĠNumber >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweighted ( items . keys , Ġitems . values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġweighted ( items : ĠIterable < T >, Ġweights : ĠIterable < Number >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġweights . map Ġ{ Ġit . toDouble () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġw . filter Ġ{ Ġit Ġ> Ġ 0 Ġ}. sum () ĊĊĠĠĠĠĠĠĠ Ġrequire NotEmpty ( items ) ĊĠĠĠĠĠĠĠ Ġrequire ( items . count () Ġ== Ġw . count ()) Ġ{ Ġ" Items Ġand Ġweights Ġmust Ġhave Ġthe Ġsame Ġsize " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( sum Ġ> Ġ 0 . 0 ) Ġ{ Ġ" The Ġweights Ġsum Ġmust Ġbe Ġhigher Ġthan Ġ 0 " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġrng . next Double ( sum ) ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġw . count ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġw . elementAt ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġweight ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( weight Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Ġ<= Ġtotal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitems . elementAt ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġitems . last () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠV > Ġweighted ( map : ĠMap < K , ĠV >, Ġweights : ĠIterable < Number >): ĠMap . Entry < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweighted ( map . entries , Ġweights ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġweighted ( weights : ĠIterable < Number >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠT :: class . java . enum Constants ĊĊĠĠĠĠĠĠĠ Ġreturn Ġweighted ( values , Ġweights ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġmany ( items : ĠIterable < T >, Ġcount : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( items . count () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġmany ( items : ĠArray < T >, Ġcount : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( items . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmany ( string : ĠString , Ġcount : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( string . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( one ( string )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠV > Ġmany ( map : ĠMap < K , ĠV >, Ġcount : ĠInt ): ĠList < Map . Entry < K , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( map . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġmany ( count : ĠInt ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( T :: class . java . enum Constants . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġone ( items : ĠIterable < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire NotEmpty ( items ) ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġrng . nextInt ( items . count ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġitems . elementAt ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġone ( items : ĠArray < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġone ( items . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġone ( string : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġone ( string . toList ()). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠV > Ġone ( map : ĠMap < K , ĠV >): ĠMap . Entry < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġone ( map . entries ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġone (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠT :: class . java . enum Constants ĊĊĠĠĠĠĠĠĠ Ġreturn Ġone ( values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġrequire NotEmpty ( items : ĠIterable < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( items . count () Ġ> Ġ 0 ) Ġ{ Ġ" No Ġitems Ġprovided " Ġ} ĊĠĠĠ Ġ} Ċ }