package Ġcom . tris zt 4 n . wire world . model Ċ Ċ /** Ċ Ġ* ĠFrom Ġy inp eng 's ĠKotlin - matrix Ġimplementation , Ġonly ĠMatrix . kt Ċ Ġ* ĠMod ifications Ġnoted Ġbelow Ġin Ġcode Ċ Ġ* Ċ Ġ* ĠSource : Ġhttps :// github . com / y inp eng / kotlin - matrix Ċ Ġ* ĠUnder ĠApache - 2 . 0 Ġlicense Ċ Ġ*/ Ċ Ċ interface ĠMatrix < out ĠT > Ġ{ ĊĠĠĠ Ġval Ġcols : ĠInt ĊĠĠĠ Ġval Ġrows : ĠInt ĊĊĠĠĠ Ġoperator Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ): ĠT Ċ } Ċ Ċ val Ġ< T > ĠMatrix < T >. size : ĠInt ĊĠĠĠ Ġget () Ġ= Ġthis . cols Ġ* Ġthis . rows Ċ Ċ interface ĠMutable Matrix < T >: ĠMatrix < T > Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġset ( x : ĠInt , Ġy : ĠInt , Ġvalue : ĠT ) Ċ } Ċ Ċ abstract Ġclass ĠAbstract Matrix < out ĠT >: ĠMatrix < T > Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġsb . append ('[ ') ĊĠĠĠĠĠĠĠ ĠforEach Indexed Ġ{ Ġx , Ġy , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ=== Ġ-> Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('[ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( value . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġcols - 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (' ]') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ< Ġrows - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (' ]') ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠMatrix <* >) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ// Ġ!== Ġ-> Ġ!= ĊĠĠĠĠĠĠĠ Ġif Ġ( rows Ġ!= Ġother . rows Ġ|| Ġcols Ġ!= Ġother . cols ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġeq Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠforEach Indexed Ġ{ Ġx , Ġy , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other [ x , Ġy ] Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ! . equals () Ġ-> Ġ!= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġother [ x , Ġy ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġeq ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġ 1 7 ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġh Ġ* Ġ 3 9 Ġ+ Ġcols ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġh Ġ* Ġ 3 9 Ġ+ Ġrows ĊĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġh Ġ= Ġh Ġ* Ġ 3 7 Ġ+ Ġ( it ?. hashCode () Ġ?: Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġh ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRemoved ĠTr ansp osed Matrix , Ġnot Ġneeded Ċ Ġ*/ Ċ Ċ internal Ġopen Ġclass ĠList Matrix < out ĠT >( override Ġval Ġcols : ĠInt , Ġoverride Ġval Ġrows : ĠInt , Ġprotected Ġval Ġlist : ĠList < T >) Ġ: ĠAbstract Matrix < T >() Ġ{ ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠI Ġneeded Ġthis Ġvalidation ĊĠĠĠĠĠĠĠ Ġrequire ( x Ġ>= Ġ 0 Ġ&& Ġy Ġ>= Ġ 0 Ġ&& Ġx Ġ< Ġcols Ġ&& Ġy Ġ< Ġrows ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist [ y * cols + x ] ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠMutable List Matrix < T >( cols : ĠInt , Ġrows : ĠInt , Ġlist : ĠMutable List < T >) Ġ: ĠList Matrix < T >( cols , Ġrows , Ġlist ), ĠMutable Matrix < T > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset ( x : ĠInt , Ġy : ĠInt , Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠI Ġneeded Ġthis Ġvalidation ĊĠĠĠĠĠĠĠ Ġrequire ( x Ġ>= Ġ 0 Ġ&& Ġy Ġ>= Ġ 0 Ġ&& Ġx Ġ< Ġcols Ġ&& Ġy Ġ< Ġrows ) ĊĠĠĠĠĠĠĠ Ġ( list Ġas ĠMutable List < T >) [ y * cols + x ] Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > Ġmatrix Of ( cols : ĠInt , Ġrows : ĠInt , Ġvar arg Ġelements : ĠT ): ĠMatrix < T > Ġ{ ĊĠĠĠ Ġreturn ĠList Matrix ( cols , Ġrows , Ġelements . asList ()) Ċ } Ċ Ċ fun Ġ< T > Ġmutable Matrix Of ( cols : ĠInt , Ġrows : ĠInt , Ġvar arg Ġelements : ĠT ): ĠMutable Matrix < T > Ġ{ ĊĠĠĠ Ġreturn ĠMutable List Matrix ( cols , Ġrows , Ġelements . to Mutable List ()) Ċ } Ċ Ċ // Ġinline Ġprivate Ġ-> Ġprivate Ġinline Ċ private Ġinline Ġfun Ġ< T > Ġprepare List For Matrix ( cols : ĠInt , Ġrows : ĠInt , Ġinit : Ġ( Int , ĠInt ) Ġ-> ĠT ): ĠArrayList < T > Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= ĠArrayList < T >( cols Ġ* Ġrows ) ĊĠĠĠ Ġ// Ġ 0 .. x - 1 Ġ-> Ġ 0 Ġuntil Ġx ĊĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġcols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( init ( x , Ġy )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlist Ċ } Ċ Ċ @ Suppress (" NON _ PUBLIC _ CALL _ FROM _ PUBLIC _ INLINE ") Ċ inline Ġfun Ġ< T > Ġcreate Matrix ( cols : ĠInt , Ġrows : ĠInt , Ġinit : Ġ( Int , ĠInt ) Ġ-> ĠT ): ĠMatrix < T > Ġ{ ĊĠĠĠ Ġreturn ĠList Matrix ( cols , Ġrows , Ġprepare List For Matrix ( cols , Ġrows , Ġinit )) Ċ } Ċ Ċ @ Suppress (" NON _ PUBLIC _ CALL _ FROM _ PUBLIC _ INLINE ") Ċ inline Ġfun Ġ< T > Ġcreate Mutable Matrix ( cols : ĠInt , Ġrows : ĠInt , Ġinit : Ġ( Int , ĠInt ) Ġ-> ĠT ): ĠMutable Matrix < T > Ġ{ ĊĠĠĠ Ġreturn ĠMutable List Matrix ( cols , Ġrows , Ġprepare List For Matrix ( cols , Ġrows , Ġinit )) Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠU > ĠMatrix < T >. map Indexed ( transform : Ġ( Int , ĠInt , ĠT ) Ġ-> ĠU ): ĠMatrix < U > Ġ{ ĊĠĠĠ Ġreturn Ġcreate Matrix ( cols , Ġrows ) Ġ{ Ġx , Ġy Ġ-> Ġtransform ( x , Ġy , Ġthis [ x , Ġy ]) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠU > ĠMatrix < T >. map ( transform : Ġ( T ) Ġ-> ĠU ): ĠMatrix < U > Ġ{ ĊĠĠĠ Ġ// Ġx , Ġy Ġ-> Ġ_, Ġ_ ĊĠĠĠ Ġreturn Ġmap Indexed Ġ{ Ġ_, Ġ_, Ġvalue Ġ-> Ġtransform ( value ) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠMatrix < T >. forEach Indexed ( action : Ġ( Int , ĠInt , ĠT ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġ// Ġ 0 .. x - 1 Ġ-> Ġ 0 Ġuntil Ġx ĊĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġcols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( x , Ġy , Ġthis [ x , Ġy ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠMatrix < T >. forEach ( action : Ġ( T ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġ// Ġx , Ġy Ġ-> Ġ_, Ġ_ ĊĠĠĠ ĠforEach Indexed Ġ{ Ġ_, Ġ_, Ġvalue Ġ-> Ġaction ( value ) Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠMatrix < T >. toList (): ĠList < T > Ġ{ ĊĠĠĠ Ġreturn Ġprepare List For Matrix ( cols , Ġrows ) Ġ{ Ġx , Ġy Ġ-> Ġthis [ x , Ġy ] Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠMatrix < T >. to Mutable List (): ĠMutable List < T > Ġ{ ĊĠĠĠ Ġreturn Ġprepare List For Matrix ( cols , Ġrows ) Ġ{ Ġx , Ġy Ġ-> Ġthis [ x , Ġy ] Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T > ĠIterable < T >. to ArrayList ( size : ĠInt ): ĠArrayList < T > Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= ĠArrayList < T >( size ) ĊĠĠĠ Ġval Ġitr Ġ= Ġiterator () ĊĊĠĠĠ Ġ// Ġ 0 .. x - 1 Ġ-> Ġ 0 Ġuntil Ġx ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( itr . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( itr . next ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġenough Ġelements ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlist Ċ } Ċ Ċ fun Ġ< T > ĠIterable < T >. to Matrix ( cols : ĠInt , Ġrows : ĠInt ): ĠMatrix < T > Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġto ArrayList ( cols Ġ* Ġrows ) ĊĠĠĠ Ġreturn ĠList Matrix ( cols , Ġrows , Ġlist ) Ċ } Ċ Ċ fun Ġ< T > ĠIterable < T >. to Mutable Matrix ( cols : ĠInt , Ġrows : ĠInt ): ĠMutable Matrix < T > Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġto ArrayList ( cols Ġ* Ġrows ) ĊĠĠĠ Ġreturn ĠMutable List Matrix ( cols , Ġrows , Ġlist ) Ċ } Ċ