package Ġday 1 6 Ċ Ċ import Ġget Input Ċ import Ġjava . util .* Ċ import Ġkotlin . test . assertEquals Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġget Input ( 1 6 ). read Lines (). first (). split (',' ). map Ġ{ ĠInstruction . fromString ( it ) Ġ} ĊĠĠĠ Ġval Ġprograms Ġ= ĠChar Array ( 1 6 ) Ġ{ Ġ( it Ġ+ Ġ' a '. toInt ()). to Char () Ġ} ĊĊĠĠĠ ĠassertEquals (" oci ed p jb m fn k hl ga ", Ġpart 1 ( programs , Ġinput )) ĊĠĠĠ ĠassertEquals (" gn fl b ko jh ic p me ad ", Ġpart 2 ( programs , Ġinput )) Ċ } Ċ Ċ sealed Ġclass ĠInstruction Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom String ( input : ĠString ): ĠInstruction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġinput [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġinput . substring ( 1 ). split ('/') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' s ' Ġ-> ĠSpin ( rest [ 0 ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' x ' Ġ-> ĠExchange ( rest [ 0 ]. toInt (), Ġrest [ 1 ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' p ' Ġ-> ĠPartner ( rest [ 0 ][ 0 ], Ġrest [ 1 ][ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġapply ( input : ĠChar Array ): ĠChar Array ĊĊĠĠĠ Ġdata Ġclass ĠSpin ( private Ġval Ġx : ĠInt ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( input : ĠChar Array ): ĠChar Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input . size Ġ< Ġx ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġinput . copyOf Range ( input . size Ġ- Ġx , Ġinput . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġinput . copyOf Range ( 0 , Ġinput . size Ġ- Ġx ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp 1 Ġ+ Ġp 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠExchange ( private Ġval Ġx : ĠInt , Ġprivate Ġval Ġy : ĠInt ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( input : ĠChar Array ): ĠChar Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ! in Ġinput . indices Ġ|| Ġy Ġ! in Ġinput . indices ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġinput . copyOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy [ x ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy [ x ] Ġ= Ġcopy [ y ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy [ y ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠPartner ( private Ġval Ġx : ĠChar , Ġprivate Ġval Ġy : ĠChar ) Ġ: ĠInstruction () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( input : ĠChar Array ): CharArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġinput . indexOf ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Ġ= Ġinput . indexOf ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ! in Ġinput . indices Ġ|| Ġj Ġ! in Ġinput . indices ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= Ġinput . copyOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy [ i ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy [ i ] Ġ= Ġcopy [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy [ j ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġpart 1 ( programs : ĠChar Array , Ġinstructions : ĠList < Instruction >): ĠString Ġ{ ĊĠĠĠ Ġval Ġtransformed Ġ= Ġinstructions . fold ( programs , Ġ{ acc , Ġinst Ġ-> Ġinst . apply ( acc )}) ĊĠĠĠ Ġreturn Ġtransformed . join ToString ( separator Ġ= Ġ"") Ċ } Ċ Ċ fun Ġpart 2 ( programs : ĠChar Array , Ġinstructions : ĠList < Instruction >): ĠString Ġ{ ĊĠĠĠ Ġvar Ġtransformed Ġ= Ġprograms . copyOf () ĊĠĠĠ Ġval Ġtransformations Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġ( 1 .. Int . MAX _ VALUE ). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġtransformed Ġ= Ġinstructions . fold ( transformed , Ġ{ acc , Ġinst Ġ-> Ġinst . apply ( acc )}) ĊĠĠĠĠĠĠĠ Ġif Ġ( Arrays . equals ( transformed , Ġprograms )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtransformations [ 1 _ 0 0 0 _ 0 0 0 _ 0 0 0 Ġ% Ġit Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtransformations . add ( transformed . join ToString ( separator Ġ= Ġ"")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġ"" Ċ } Ċ