@ file : Kotlin Opts ("- J - ea ") Ċ Ċ import Ġjava . io . File Ċ Ċ // ĠLet 's Ġbuild Ġa Ġlinked Ġcircle ! Ċ // ĠR ationale : ĠPerform ing Ġthe Ġarrange ments Ġand Ġlook ups Ġnecessary Ġto Ġtake Ġa Ġturn Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġin efficient Ġusing Ġeither ĠArrayList Ġor ĠLinkedList Ġfrom Ġthe Ġstd Ġlib . Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠAs Ġthe Ġoperations Ġare Ġotherwise Ġtrivial , Ġf lying Ġour Ġown Ġseems Ġfe asible . Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠChe at : ĠC ups Game Ġmaintains Ġan Ġindex Ġvalue -> Cup Ġto Ġavoid Ġlinear Ġscans . Ċ Ċ data Ġclass ĠC up ( val Ġvalue : ĠInt , Ġvar Ġnext In Circle : ĠC up ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Cup ($ value , Ġ-> ${ next In Circle ?. value })" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠC ups Game ( cup Values : ĠSequence < Int >) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcurrent Cup : ĠC up ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġvalue Ġto Ġelement Ġin Ġlinked Ġcircle ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcup Index : ĠMap < Int , ĠC up > ĊĠĠĠ Ġprivate Ġval Ġmax Cup Value Ġ= Ġcup Values . max OrNull () !! ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc ups Ġ= Ġcup Values . map Ġ{ ĠC up ( it ) Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġc ups . zip With Next Ġ{ Ġa , Ġb Ġ-> Ġa . next In Circle Ġ= Ġb Ġ} ĊĠĠĠĠĠĠĠ Ġc ups . last (). next In Circle Ġ= Ġc ups . first () ĊĠĠĠĠĠĠĠ Ġcurrent Cup Ġ= Ġc ups . first () ĊĠĠĠĠĠĠĠ Ġassert ( c ups . all Ġ{ Ġit . next In Circle Ġ!= Ġnull Ġ}) Ġ{ Ġ" Gap Ġin Ġthe Ġcircle !" Ġ} ĊĊĠĠĠĠĠĠĠ Ġcup Index Ġ= Ġc ups . map Ġ{ ĠPair ( it . value , Ġit ) Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcircle Size : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcup Index . size ĊĊĠĠĠ Ġfun Ġtake Turn () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġprintln (" c ups : Ġ$ this ") ĊĠĠĠĠĠĠĠ Ġval Ġpicked Up Ġ= Ġas Sequence ( current Cup ). drop ( 1 ). take ( 3 ). toList () ĊĠĠĠĠĠĠĠ Ġval Ġpicked Up Values Ġ= Ġpicked Up . map Ġ{ Ġit . value Ġ} Ċ // ĠĠĠĠĠĠĠ Ġprintln (" pick ed Ġup : Ġ$ pick ed Up Values ") ĊĠĠĠĠĠĠĠ Ġval Ġdestination Cup Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( current Cup . value Ġ- Ġ 1 Ġdown To Ġ 1 ). as Sequence () Ġ+ Ġ( max Cup Value Ġdown To Ġcurrent Cup . value Ġ+ Ġ 1 ). as Sequence ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġ! pick ed Up Values . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġcup Index [ it ] !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" All Ġc ups Ġpicked ?") Ċ // ĠĠĠĠĠĠĠ Ġprintln (" destination : Ġ${ destination Cup . value }") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRew ire : ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġcurrent Cup Ġ-> Ġ[ pick ed Up ] Ġ-> ĠA ĠĠ Ġ... Ġ Ġdestination Cup Ġ-> ĠB ĊĠĠĠĠĠĠĠ Ġ// Ġ--> Ġ Ġcurrent Cup Ġ-> ĠA ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... Ġdestination Cup Ġ-> Ġ[ pick ed Up ] Ġ-> ĠB ĊĠĠĠĠĠĠĠ Ġcurrent Cup . next In Circle Ġ= Ġpicked Up . last (). next In Circle ĊĠĠĠĠĠĠĠ Ġval Ġtmp B Ġ= Ġdestination Cup . next In Circle !! ĊĠĠĠĠĠĠĠ Ġdestination Cup . next In Circle Ġ= Ġpicked Up . first () ĊĠĠĠĠĠĠĠ Ġpicked Up . last (). next In Circle Ġ= Ġtmp B ĊĊĠĠĠĠĠĠĠ Ġ// ĠAnd Ġprepare Ġfor Ġnext Ġturn : ĊĠĠĠĠĠĠĠ Ġcurrent Cup Ġ= Ġcurrent Cup . next In Circle !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Sequence ( starting Cup : ĠC up Ġ= Ġcurrent Cup ) Ġ= ĊĠĠĠĠĠĠĠ Ġgenerate Sequence ( starting Cup ) Ġ{ Ġlast Cup Ġ-> Ġlast Cup . next In Circle . take If Ġ{ Ġit Ġ!= Ġstarting Cup Ġ} Ġ} ĊĊĠĠĠ Ġfun Ġto Answer (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġcup Index [ 1 ]?. let Ġ{ Ġcup 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas Sequence ( cup 1 ). drop ( 1 ). join ToString ("") Ġ{ Ġ"${ it . value }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠIllegalStateException (" We Ġlost Ġcup Ġ 1 !") ĊĊĠĠĠ Ġfun Ġcup sWith St ars (): ĠList < Cup > Ġ= ĊĠĠĠĠĠĠĠ Ġcup Index [ 1 ]?. let Ġ{ Ġcup 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas Sequence ( cup 1 ). drop ( 1 ). take ( 2 ). toList () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠIllegalStateException (" We Ġlost Ġcup Ġ 1 !") ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġif Ġ( it Ġ== Ġcurrent Cup ) Ġ" (${ it . value })" Ġelse Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (" Ġ") Ċ } Ċ Ċ fun Ġcr ab ify ( cup Values : ĠSequence < Int >): ĠSequence < Int > Ġ= ĊĠĠĠ Ġcup Values Ġ+ Ġ(( cup Values . max OrNull () !! Ġ+ Ġ 1 ) .. 1 _ 0 0 0 _ 0 0 0 ). as Sequence () Ċ Ċ fun Ġplay ( starting Arrange ment : ĠC ups Game , Ġrounds : ĠInt Ġ= Ġ 1 0 0 ) Ġ{ ĊĠĠĠ Ġfor Ġ( round Ġin Ġ 1 .. rounds ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġprintln ("-- Ġmove Ġ$ round Ġ-- ") ĊĠĠĠĠĠĠĠ Ġstarting Arrange ment . take Turn () Ċ // ĠĠĠĠĠĠĠ Ġprintln ("") ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġ""" Ċ // ĠĠĠĠĠĠĠ Ġ--- Ġfinal Ġ-- Ċ // ĠĠĠĠĠĠĠ Ġc ups : Ġ$ starting Arrange ment Ċ // ĠĠĠ Ġ""" . trim Indent (). let Ġ{ Ġprintln ( it ) Ġ} Ċ } Ċ Ċ // ĠInput : Ċ val Ġcup Values Ġ= ĠFile ( args [ 0 ]). read Text (). trim (). map Ġ{ Ġ"$ it ". toInt () Ġ}. as Sequence () Ċ Ċ // ĠPart Ġ 1 : Ċ with ( C ups Game ( cup Values )) Ġ{ ĊĠĠĠ Ġplay ( this , Ġ 1 0 0 ) ĊĠĠĠ Ġprintln ( to Answer ()) Ċ } Ċ Ċ // ĠPart Ġ 2 : Ċ with ( C ups Game ( cr ab ify ( cup Values ))) Ġ{ ĊĠĠĠ Ġassert ( circle Size Ġ== Ġ 1 _ 0 0 0 _ 0 0 0 ) Ġ{ Ġ" wrong Ġnumber Ġof Ġc ups : Ġ$ circle Size " Ġ} ĊĠĠĠ Ġassert ( as Sequence (). map Ġ{ Ġit . value Ġ}. distinct (). count () Ġ== Ġ 1 _ 0 0 0 _ 0 0 0 ) Ġ{ Ġ" duplicate Ġnumbers !" Ġ} ĊĠĠĠ Ġplay ( this , Ġ 1 0 _ 0 0 0 _ 0 0 0 ) ĊĠĠĠ Ġcup sWith St ars () Ċ // ĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġprintln ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . value . to Long () Ġ} ĊĠĠĠĠĠĠĠ Ġ. reduce ( Long :: times ) ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġprintln ( it ) Ġ} Ċ } Ċ