/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġbenchmarks . flow . scr ab ble Ċ Ċ import Ġreactor . core . publisher .* Ċ import Ġjava . lang . Long .* Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Function Ċ Ċ /* @ W arm up ( iterations Ġ= Ġ 5 , Ġtime Ġ= Ġ 1 , Ġtime Unit Ġ= ĠTimeUnit . SECONDS ) Ċ @ Measurement ( iterations Ġ= Ġ 5 , Ġtime Ġ= Ġ 1 , Ġtime Unit Ġ= ĠTimeUnit . SECONDS ) Ċ @ Fork ( value Ġ= Ġ 1 ) Ċ @ Benchmark Mode ( Mode . Average Time ) Ċ @ Output TimeUnit ( TimeUnit . MILLISECONDS ) Ċ @ State ( Scope . Benchmark ) */ Ċ open Ġclass ĠRe actor Play s Scr ab ble Ġ: ĠSh akes pe are Play s Scr ab ble () Ġ{ Ċ Ċ // ĠĠĠ Ġ@ Benchmark ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġplay (): ĠList < Map . Entry < Int , ĠList < String >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscore Of AL et ter Ġ= ĠFunction < Int , ĠFlux < Int >> Ġ{ Ġletter Ġ-> ĠFlux . just ( letter Scores [ letter Ġ- Ġ' a '. toInt ()]) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġletter Score Ġ= ĠFunction < Map . Entry < Int , ĠLong Wrapper >, ĠFlux < Int >> Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġletter Scores [ entry . key Ġ- Ġ' a '. toInt ()] Ġ* ĠInteger . min ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . value . get (). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscr ab ble Available Letters [ entry . key Ġ- Ġ' a '. toInt ()] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġto Integer Stream Ġ= ĠFunction < String , ĠFlux < Int >> Ġ{ Ġstring Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from Iterable ( Iterable Spl iterator . of ( string . chars (). boxed (). spl iterator ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġh isto Of Letters Ġ= ĠFunction < String , ĠFlux < HashMap < Int , ĠLong Wrapper >>> Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from ( to Integer Stream . apply ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠHashMap () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġmap : ĠHashMap < Int , ĠLong Wrapper >, Ġvalue : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠnewValue : ĠLong Wrapper ? Ġ= Ġmap [ value ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= ĠLong Wrapper . zero () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ value ] Ġ= ĠnewValue . inc AndSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġblank Ġ= ĠFunction < Map . Entry < Int , ĠLong Wrapper >, ĠFlux < Long >> Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . just ( max ( 0 L , Ġentry . value . get () Ġ- Ġscr ab ble Available Letters [ entry . key Ġ- Ġ' a '. toInt () ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġn Bl anks Ġ= ĠFunction < String , ĠFlux < Long >> Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from ( h isto Of Letters . apply ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap < Map . Entry < Int , ĠLong Wrapper >> Ġ{ Ġmap Ġ-> ĠFlux . from Iterable < Map . Entry < Int , ĠLong Wrapper >>( Iterable Ġ{ Ġmap . entries . iterator () Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap ( blank ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa , Ġb Ġ-> Ġsum ( a , Ġb ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcheck Bl anks Ġ= ĠFunction < String , ĠFlux < Boolean >> Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Bl anks . apply ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġl Ġ-> ĠFlux . just ( l Ġ<= Ġ 2 L ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġscore 2 Ġ= ĠFunction < String , ĠFlux < Int >> Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from ( h isto Of Letters . apply ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap < Map . Entry < Int , ĠLong Wrapper >> Ġ{ Ġmap Ġ-> ĠFlux . from Iterable < Map . Entry < Int , ĠLong Wrapper >>( Iterable Ġ{ Ġmap . entries . iterator () Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap ( letter Score ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa , Ġb Ġ-> ĠInteger . sum ( a , Ġb ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst 3 Ġ= ĠFunction < String , ĠFlux < Int >> Ġ{ Ġword Ġ-> ĠFlux . from Iterable ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIterable Spl iterator . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . chars (). boxed (). limit ( 3 ). spl iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlast 3 Ġ= ĠFunction < String , ĠFlux < Int >> Ġ{ Ġword Ġ-> ĠFlux . from Iterable ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIterable Spl iterator . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . chars (). boxed (). skip ( 3 ). spl iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġto Be Max ed Ġ= ĠFunction < String , ĠFlux < Int >> Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . just ( first 3 . apply ( word ), Ġlast 3 . apply ( word )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠStream Ġ-> ĠStream Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠB onus Ġfor Ġdouble Ġletter ĊĠĠĠĠĠĠĠ Ġval Ġbonus For Double Letter Ġ= ĠFunction < String , ĠFlux < Int >> Ġ Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from < Int >( toBe Max ed . apply ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap < Int >( score Of AL et ter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa , Ġb Ġ-> ĠInteger . max ( a , Ġb ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscore 3 Ġ= ĠFunction < String , ĠFlux < Int >> Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from ( Flux . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscore 2 . apply ( word ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscore 2 . apply ( word ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbonus For Double Letter . apply ( word ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbonus For Double Letter . apply ( word ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . just ( if Ġ( word . length Ġ== Ġ 7 ) Ġ 5 0 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠStream Ġ-> ĠStream Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa , Ġb Ġ-> ĠInteger . sum ( a , Ġb ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild H isto On Score Ġ= ĠFunction < Function < String , ĠFlux < Int >>, ĠFlux < TreeMap < Int , ĠList < String >>>> Ġ{ Ġscore Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from ( Flux . from Iterable ( Iterable Ġ{ Ġsh akes pe are Words . iterator () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( Ġ{ Ġscr ab ble Words . contains ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ({ Ġword Ġ-> Ġcheck Bl anks . apply ( word ). to Iterable (). iterator (). next () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠTreeMap < Int , ĠList < String >>( Collections . reverse Order ()) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġmap : ĠTreeMap < Int , ĠList < String >>, Ġword : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġscore . apply ( word ). to Iterable (). iterator (). next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Ġ= Ġmap [ key ] Ġas ĠMutable List < String >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ key ] Ġ= Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfinal List 2 Ġ= ĠFlux . from < ArrayList < Map . Entry < Int , ĠList < String >>> >( build H isto On Score . apply ( score 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap < Map . Entry < Int , ĠList < String >>> Ġ{ Ġmap Ġ-> ĠFlux . from Iterable < Map . Entry < Int , ĠList < String >> >( Iterable Ġ{ Ġmap . entries . iterator () Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect < ArrayList < Map . Entry < Int , ĠList < String >>> >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠArrayList () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlist , Ġentry Ġ-> Ġlist . add ( entry ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). to Iterable (). iterator (). next () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfinal List 2 ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ