package Ġp oker hands Ċ Ċ import Ġjava . security . Invalid Parameter Exception Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġprintln (" ~~~ ĠWelcome Ġto Ġthe Ġcas ino Ġ!!! Ġ ~~~ ") ĊĠĠĠ Ġvar Ġinput Ġ= Ġif Ġ( args . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Enter Ġplayers Ġdeal Ġ( or Ġblank Ġfor Ġrandom Ġhands ): Ġ") ĊĠĠĠĠĠĠĠ Ġread Line () !! ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġargs [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġexit Ġ= Ġfalse ĊĠĠĠ Ġwhile Ġ(! exit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP oker H ands ( input ) ĊĠĠĠĠĠĠĠ Ġprintln ("\ n -------------------------------- --- ") ĊĠĠĠĠĠĠĠ Ġprintln (" ĠEnter Ġanother Ġinput Ġor Ġa Ġsingle Ġletter Ġto Ġquit :") ĊĠĠĠĠĠĠĠ Ġinput Ġ= Ġread Line () !! ĊĠĠĠĠĠĠĠ Ġif Ġ( input . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ~~~ ĠBy e Ġ ~~~ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠP oker H ands ( input : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġhands : ĠMap < String , ĠHand > ĊĠĠĠ Ġprivate Ġval Ġrules Ġ= ĠP oker Rules () ĊĠĠĠ Ġprivate Ġval Ġdeck Ġ= ĠDeck () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeal Ġ= Ġif Ġ( input . isBlank ()) Ġdeck . deal () Ġelse Ġinput ĊĠĠĠĠĠĠĠ Ġhands Ġ= Ġdeal . split (" Ġ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHand . fromString ( it ). let Ġ{ Ġhand Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhand . name Ġto Ġhand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġprint Game () ĊĠĠĠĠĠĠĠ Ġprint Winner () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġhands . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Winner () Ġ{ ĊĠĠĠĠĠĠĠ Ġwinner () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwinner (): ĠP oker Result ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġhands . map Ġ{ Ġrules . hand Result ( it . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . rank Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Sorted Map () ĊĠĠĠĠĠĠĠ Ġval Ġhighest H ands Ġ= Ġresults [ results . last Key ()] Ġ?: Ġthrow ĠException (" There Ġshould Ġalways Ġbe Ġone ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġprintln ( highest H ands ) ĊĠĠĠĠĠĠĠ Ġval Ġwinner Ġ= Ġif Ġ( highest H ands . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest H ands . first () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġboth Ġplayers Ġhave Ġsame Ġrank ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer 1 Ġ= Ġhighest H ands . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer 2 Ġ= Ġhighest H ands . last () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . H ight Card Ġ&& Ġplayer 2 Ġis ĠP oker Result . H ight Card Ġ-> Ġrules . set tle Highest Hand Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . One Pair Ġ&& Ġplayer 2 Ġis ĠP oker Result . One Pair Ġ-> Ġrules . set tle One Pair Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . Two Pairs Ġ&& Ġplayer 2 Ġis ĠP oker Result . Two Pairs Ġ-> Ġrules . set tle Two Pairs Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . Three Kind Ġ&& Ġplayer 2 Ġis ĠP oker Result . Three Kind Ġ-> Ġrules . set tle Three Of A Kind Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . Str aight Ġ&& Ġplayer 2 Ġis ĠP oker Result . Str aight Ġ-> Ġrules . set tle Str aight Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . Flush Ġ&& Ġplayer 2 Ġis ĠP oker Result . Flush Ġ-> Ġrules . set tle Flush Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . Full Ġ&& Ġplayer 2 Ġis ĠP oker Result . Full Ġ-> Ġrules . set tle Full Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . Four Kind Ġ&& Ġplayer 2 Ġis ĠP oker Result . Four Kind Ġ-> Ġrules . set tle Four Of A Kind Winner ( player 1 , Ġplayer 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 Ġis ĠP oker Result . Str aight Flush Ġ&& Ġplayer 2 Ġis ĠP oker Result . Str aight Flush Ġ-> Ġrules . set tle Str aight Flush Winner ( player 1 , Ġplayer 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" Results Ġshould Ġbe Ġboth Ġsame Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( winner Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ winner . player } Ġwins . Ġ- Ġwith Ġ${ winner . label }: Ġ${ winner . win Detail () }") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" T ie .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwinner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhand For ( name : ĠString ) Ġ= Ġhands [ name ] Ġ?: Ġthrow ĠInvalid Parameter Exception (" Unknown Ġhand : Ġ$ name ") Ċ } Ċ