/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġby ĠT odd ĠG ins berg Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠAd vent Ġof ĠCode Ġ 2 0 1 9 , ĠDay Ġ 2 2 Ġ- ĠSl am ĠSh uffle Ċ Ġ* ĠProblem ĠDescription : Ġhttp :// ad vent of code . com / 2 0 1 9 / day / 2 2 Ċ Ġ* ĠBlog ĠPost / Comment ary : Ġhttps :// tod d . gin s berg . com / post / ad vent - of - code / 2 0 1 9 / day 2 2 / Ċ Ġ*/ Ċ package Ġcom . gin s berg . ad vent 2 0 1 9 Ċ Ċ import Ġjava . math . BigInteger Ċ import Ġjava . math . BigInteger . ONE Ċ import Ġjava . math . BigInteger . ZERO Ċ import Ġkotlin . math . absolute Value Ċ Ċ class ĠDay 2 2 ( private Ġval Ġinput : ĠList < String >) Ġ{ ĊĊĠĠĠ Ġfun Ġsolve Part 1 (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġfollow Instructions (). indexOf ( 2 0 1 9 ) ĊĊĠĠĠ Ġfun Ġsolve Part 2 (): ĠBigInteger Ġ= ĊĠĠĠĠĠĠĠ Ġmodular Arithmetic Version ( 2 0 2 0 . to BigInteger ()) ĊĊĠĠĠ Ġprivate Ġfun Ġmodular Arithmetic Version ( find : ĠBigInteger ): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmemory Ġ= ĠarrayOf ( ONE , ĠZERO ) ĊĠĠĠĠĠĠĠ Ġinput . reversed (). forEach Ġ{ Ġinstruction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cut " Ġin Ġinstruction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ 1 ] Ġ+= Ġinstruction . get BigInteger () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" increment " Ġin Ġinstruction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction . get BigInteger (). mod Pow ( NUMBER _ OF _ CAR DS Ġ- ĠTWO , ĠNUMBER _ OF _ CAR DS ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ 0 ] Ġ*= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ 1 ] Ġ*= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" stack " Ġin Ġinstruction Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ 0 ] Ġ= Ġmemory [ 0 ]. neg ate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ 1 ] Ġ= Ġ( memory [ 1 ]. inc ()). neg ate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ 0 ] Ġ% = ĠNUMBER _ OF _ CAR DS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory [ 1 ] Ġ% = ĠNUMBER _ OF _ CAR DS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpower Ġ= Ġmemory [ 0 ]. mod Pow ( SH UFF LES , ĠNUMBER _ OF _ CAR DS ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ(( power Ġ* Ġfind ) Ġ+ Ġ(( memory [ 1 ] Ġ* Ġ( power Ġ+ ĠNUMBER _ OF _ CAR DS . dec ())) Ġ* Ġ(( memory [ 0 ]. dec ()). mod Pow ( NUMBER _ OF _ CAR DS Ġ- ĠTWO , ĠNUMBER _ OF _ CAR DS )) )). mod ( NUMBER _ OF _ CAR DS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfollow Instructions (): ĠList < Int > Ġ= ĊĠĠĠĠĠĠĠ Ġinput . fold ( create Deck ()) Ġ{ Ġdeck , Ġinstruction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cut " Ġin Ġinstruction Ġ-> Ġdeck . cut ( instruction . getInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" increment " Ġin Ġinstruction Ġ-> Ġdeck . deal ( instruction . getInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" stack " Ġin Ġinstruction Ġ-> Ġdeck . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġinstruction : Ġ$ instruction ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Deck ( length : ĠInt Ġ= Ġ 1 0 _ 0 0 7 ): ĠList < Int > Ġ= ĊĠĠĠĠĠĠĠ ĠList ( length ) Ġ{ Ġit Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Int >. cut ( n : ĠInt ): ĠList < Int > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ> Ġ 0 Ġ-> Ġthis . drop ( n ) Ġ+ Ġthis . take ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ< Ġ 0 Ġ-> Ġthis . take Last ( n . absolute Value ) Ġ+ Ġthis . drop Last ( n . absolute Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Int >. deal ( increment : ĠInt ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Deck Ġ= Ġthis . to Mutable List () ĊĠĠĠĠĠĠĠ Ġvar Ġplace Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġcard Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Deck [ place ] Ġ= Ġcard ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplace Ġ+= Ġincrement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplace Ġ% = Ġthis . size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Deck ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . getInt (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġthis . split (" Ġ"). last (). toInt () ĊĊĠĠĠ Ġprivate Ġfun ĠString . get BigInteger (): ĠBigInteger Ġ= ĊĠĠĠĠĠĠĠ Ġthis . split (" Ġ"). last (). to BigInteger () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠNUMBER _ OF _ CAR DS Ġ= Ġ 1 1 9 3 1 5 7 1 7 5 1 4 0 4 7 . to BigInteger () ĊĠĠĠĠĠĠĠ Ġval ĠSH UFF LES Ġ= Ġ 1 0 1 7 4 1 5 8 2 0 7 6 6 6 1 . to BigInteger () ĊĠĠĠĠĠĠĠ Ġval ĠTWO Ġ= Ġ 2 . to BigInteger () ĊĠĠĠ Ġ} Ċ } Ċ