package Ġeu . jan v db . a oc util . kotlin . point 3 d Ċ Ċ class ĠTransformation Ġprivate Ġconstructor ( private Ġval Ġmatrix : ĠArray < IntArray >) Ġ{ Ċ ĉ operator Ġfun Ġtimes ( point : ĠPoint 3 D ): ĠPoint 3 D Ġ{ Ċĉ ĉ return ĠPoint 3 D ( Ċĉĉ ĉ point . x Ġ* Ġmatrix [ 0 ][ 0 ] Ġ+ Ġpoint . y Ġ* Ġmatrix [ 0 ][ 1 ] Ġ+ Ġpoint . z Ġ* Ġmatrix [ 0 ][ 2 ], Ċĉĉ ĉ point . x Ġ* Ġmatrix [ 1 ][ 0 ] Ġ+ Ġpoint . y Ġ* Ġmatrix [ 1 ][ 1 ] Ġ+ Ġpoint . z Ġ* Ġmatrix [ 1 ][ 2 ], Ċĉĉ ĉ point . x Ġ* Ġmatrix [ 2 ][ 0 ] Ġ+ Ġpoint . y Ġ* Ġmatrix [ 2 ][ 1 ] Ġ+ Ġpoint . z Ġ* Ġmatrix [ 2 ][ 2 ], Ċĉ ĉ ) Ċ ĉ } ĊĊ ĉ operator Ġfun Ġtimes ( other : ĠTransformation ): ĠTransformation Ġ{ Ċĉ ĉ val Ġnew Matrix Ġ= ĠarrayOf ( int ArrayOf ( 0 , Ġ 0 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 )) Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġ 3 ) Ġ{ Ċĉĉ ĉ for Ġ( j Ġin Ġ 0 Ġuntil Ġ 3 ) Ġ{ Ċĉĉĉ ĉ for Ġ( k Ġin Ġ 0 Ġuntil Ġ 3 ) Ġ{ Ċĉĉĉĉ ĉ new Matrix [ i ][ j ] Ġ+= Ġthis . matrix [ i ][ k ] Ġ* Ġother . matrix [ k ][ j ] Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return ĠTransformation ( new Matrix ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue Ċĉ ĉ if Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse Ċĉ ĉ other Ġas ĠTransformation Ċĉ ĉ if Ġ(! matrix . content Deep Equals ( other . matrix )) Ġreturn Ġfalse Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ override Ġfun ĠhashCode () Ġ= Ġmatrix . content Deep HashCode () ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ val Ġresult Ġ= ĠStringBuilder ("[ ") Ċĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġ 3 ) Ġ{ Ċĉĉ ĉ if Ġ( i Ġ!= Ġ 0 ) Ġresult . append (", Ġ") Ċĉĉ ĉ result . append ("[ ") Ċĉĉ ĉ for Ġ( j Ġin Ġ 0 Ġuntil Ġ 3 ) Ġ{ Ċĉĉĉ ĉ if Ġ( j Ġ!= Ġ 0 ) Ġresult . append (", Ġ") Ċĉĉĉ ĉ result . append ( matrix [ i ][ j ]) Ċĉĉ ĉ } Ċĉĉ ĉ result . append (" ]") Ċĉ ĉ } Ċĉ ĉ result . append (" ]") Ċĉ ĉ return Ġresult . toString () Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ val ĠUNITY Ġ= ĠTransformation ( array Of ( int ArrayOf ( 1 , Ġ 0 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 0 , Ġ 1 ))) Ċĉ ĉ val ĠROT ATION _ X Ġ= ĠTransformation ( array Of ( int ArrayOf ( 1 , Ġ 0 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 0 , Ġ- 1 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 0 ))) Ċĉ ĉ val ĠROT ATION _ Y Ġ= ĠTransformation ( array Of ( int ArrayOf ( 0 , Ġ 0 , Ġ 1 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 0 ), Ġint ArrayOf (- 1 , Ġ 0 , Ġ 0 ))) Ċĉ ĉ val ĠROT ATION _ Z Ġ= ĠTransformation ( array Of ( int ArrayOf ( 0 , Ġ- 1 , Ġ 0 ), Ġint ArrayOf ( 1 , Ġ 0 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 0 , Ġ 1 ))) ĊĊĉ ĉ private Ġval ĠROT ATIONS _ X Ġ= Ġset Of ( UN ITY , ĠROT ATION _ X , ĠROT ATION _ X Ġ* ĠROT ATION _ X , ĠROT ATION _ X Ġ* ĠROT ATION _ X Ġ* ĠROT ATION _ X ) Ċĉ ĉ private Ġval ĠROT ATIONS _ Y Ġ= Ġset Of ( UN ITY , ĠROT ATION _ Y , ĠROT ATION _ Y Ġ* ĠROT ATION _ Y , ĠROT ATION _ Y Ġ* ĠROT ATION _ Y Ġ* ĠROT ATION _ Y ) Ċĉ ĉ private Ġval ĠROT ATIONS _ Z Ġ= Ġset Of ( UN ITY , ĠROT ATION _ Z , ĠROT ATION _ Z Ġ* ĠROT ATION _ Z , ĠROT ATION _ Z Ġ* ĠROT ATION _ Z Ġ* ĠROT ATION _ Z ) Ċĉ ĉ val ĠALL _ ROT ATIONS Ġ= ĠROT ATIONS _ X Ċĉĉ ĉ . flatMap Ġ{ Ġx Ġ-> ĠROT ATIONS _ Y . map Ġ{ Ġy Ġ-> Ġx Ġ* Ġy Ġ} Ġ} Ċĉĉ ĉ . flatMap Ġ{ Ġxy Ġ-> ĠROT ATIONS _ Z . map Ġ{ Ġz Ġ-> Ġxy Ġ* Ġz Ġ} Ġ} Ċĉĉ ĉ . toSet () Ċ ĉ } Ċ }