/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 0 - 2 0 2 1 , ĠNull Non ame Ċ Ġ* ĠKotlin Ġconverted Ġand Ġmodified Ġby ĠV en om = N hel v Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ċ Ġ* ĠĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ċ Ġ* ĠĠĠĠĠĠ Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* ĠĠĠĠ Ġ* ĠNeither Ġthe Ġname Ġof ĠNull Non ame Ġnor Ġthe Ġnames Ġof Ġits Ċ Ġ* ĠĠĠĠĠĠ Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ċ Ġ* ĠĠĠĠĠĠ Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠOWNER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġmu . nu . null po . tool . air ank st ool Ċ Ċ import Ġmu . nu . null po . game . component . Piece Ċ import Ġjava . io . Serializable Ċ import Ġjava . util . Arrays Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . pow Ċ Ċ class ĠR anks : Serializable Ġ{ Ċ ĉ private Ġval Ġranks : IntArray ĊĊ ĉ val Ġstack Width : Int Ċ ĉ val Ġsize : Int Ċ ĉ internal Ġvar Ġranks From : R anks ? Ġ= Ġnull Ċ ĉ val Ġmax Jump : Int Ċ ĉ var Ġerror Ġ= Ġ 0 Ċĉ ĉ private Ġset Ċ ĉ private Ġvar Ġmax Error Ġ= Ġ 0 Ċ ĉ private Ġvar Ġrank Min Ġ= Ġ 0 Ċ ĉ private Ġvar Ġrank Max Ġ= Ġ 0 ĊĊ ĉ private Ġvar Ġcompletion Ġ= Ġ 0 Ċ ĉ private Ġval Ġbase : Int Ċ ĉ private Ġval Ġsurface Width : Int ĊĊ ĉ val Ġcompletion Percentage : Int Ċĉ ĉ get () Ġ{ Ċĉĉ ĉ var Ġcompletion Percentage : Long Ġ= Ġ( completion . to Long ()+ 1 )* 1 0 0 Ċĉĉ ĉ completion Percentage Ġ/= Ġsize . to Long () Ċĉĉ ĉ return Ġcompletion Percentage . toInt () ĊĊĉ ĉ } Ċ ĉ val Ġerror Percentage : Float Ċĉ ĉ get () Ġ{ Ċĉĉ ĉ val Ġerror Long Ġ= Ġ( error / completion ). to Long () Ċĉĉ ĉ val Ġmax Error Possible Ġ= ĠInteger . MAX _ VALUE . to Long ()- Integer . MIN _ VALUE . to Long () Ċĉĉ ĉ var Ġerror Percentage Ġ= Ġerror Long . toFloat ()/ max Error Possible . toFloat () Ċĉĉ ĉ error Percentage Ġ*= Ġ 1 0 0 f Ċĉĉ ĉ return Ġerror Percentage Ċĉ ĉ } ĊĊ ĉ fun ĠgetMax Error (): Float Ġ= Ġmax Error . toFloat () ĊĊ ĉ fun Ġcompletion Percentage Increase (): Boolean Ġ= Ġ 0 == completion %( size / 1 0 0 ) && completion != 0 ĊĊ ĉ constructor ( max Jump : Int , Ġstack Width : Int ) Ġ{ ĊĊĉ ĉ this . max Jump Ġ= Ġmax Jump Ċĉ ĉ base Ġ= Ġ 2 * max Jump + 1 ĊĊĉ ĉ this . stack Width Ġ= Ġstack Width ĊĊĉ ĉ surface Width Ġ= Ġstack Width - 1 ĊĊĉ ĉ size Ġ= Ġbase . toDouble (). pow ( surface Width . toDouble ()). toInt () Ċĉ ĉ ranks Ġ= ĠInt Array ( size ) Ċĉ ĉ completion Ġ= Ġ 0 Ċĉ ĉ error Ġ= Ġ 0 Ċĉ ĉ max Error Ġ= Ġ 0 Ċĉ ĉ rank Min Ġ= ĠInteger . MAX _ VALUE Ċĉ ĉ rank Max Ġ= Ġ 0 Ċĉ ĉ Arrays . fill ( ranks , ĠInteger . MAX _ VALUE ) ĊĊ ĉ } ĊĊ ĉ constructor ( rank From : R anks ?) Ġ{ ĊĊĉ ĉ ranks From Ġ= Ġrank From Ċĉ ĉ max Jump Ġ= Ġranks From !!. max Jump Ċĉ ĉ base Ġ= Ġ 2 * max Jump + 1 ĊĊĉ ĉ stack Width Ġ= Ġranks From !!. stack Width Ċĉ ĉ surface Width Ġ= Ġstack Width - 1 Ċĉ ĉ size Ġ= Ġ( 2 * max Jump + 1 ). toDouble (). pow (( stack Width - 1 ). toDouble ()). toInt () Ċĉ ĉ ranks Ġ= ĠInt Array ( size ) Ċĉ ĉ completion Ġ= Ġ 0 Ċĉ ĉ error Ġ= Ġ 0 Ċĉ ĉ max Error Ġ= Ġ 0 Ċĉ ĉ rank Min Ġ= ĠInteger . MAX _ VALUE Ċĉ ĉ rank Max Ġ= Ġ 0 ĊĊ ĉ } ĊĊ ĉ fun Ġset R anks From ( ranks from : R anks ) Ġ{ Ċĉ ĉ ranks From Ġ= Ġranks from Ċĉ ĉ error Ġ= Ġ 0 Ċĉ ĉ max Error Ġ= Ġ 0 Ċĉ ĉ completion Ġ= Ġ 0 Ċĉ ĉ rank Min Ġ= ĠInteger . MAX _ VALUE Ċĉ ĉ rank Max Ġ= Ġ 0 ĊĊ ĉ } ĊĊ ĉ fun Ġfree R anks From () Ġ{ Ċĉ ĉ ranks From Ġ= Ġnull Ċ ĉ } ĊĊ ĉ fun Ġget Rank Value ( surface : Int ): Int Ġ= Ġranks [ surface ] ĊĊ ĉ fun Ġencode ( surface : IntArray ): Int Ġ{ Ċĉ ĉ var Ġsurface Num Ġ= Ġ 0 Ċĉ ĉ var Ġfactor Ġ= Ġ 1 Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġsurface Width ) Ġ{ Ċĉĉ ĉ surface Num Ġ+= Ġ( surface [ i ]+ max Jump )* factor Ċĉĉ ĉ factor Ġ*= Ġbase Ċĉ ĉ } Ċĉ ĉ return Ġsurface Num Ċ ĉ } ĊĊ ĉ private Ġfun Ġset Rank Value ( surface : Int , Ġvalue : Int ) Ġ{ Ċĉ ĉ ranks [ surface ] Ġ= Ġvalue Ċ ĉ } ĊĊ ĉ fun Ġset Rank ( surface : IntArray , Ġsurface Decoded Work : IntArray ) Ġ{ Ċĉ ĉ val Ġcurrent Surface Num Ġ= Ġencode ( surface ) Ċĉ ĉ set Rank Value ( current Surface Num , Ġget Rank ( surface , Ġsurface Decoded Work )) Ċĉ ĉ synchronized ( this ) Ġ{ Ċĉĉ ĉ completion ++ Ċĉĉ ĉ var Ġerror Current Ġ= Ġabs ( ranks [ current Surface Num ]- ranks From !!. get Rank Value ( current Surface Num )) Ċĉĉ ĉ if ( error Current == 0 ) Ġerror Current Ġ= Ġ 0 Ċĉĉ ĉ if ( error Current > max Error ) Ġmax Error Ġ= Ġerror Current Ċĉĉ ĉ error Ġ+= Ġerror Current Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġscale R anks () Ġ{ Ċĉ ĉ /* Ġint Ġpas Ġ=( Integer . MAX _ VALUE - rank Min )/ 4 ; Ċ Ġ* Ġint Ġn 1 = 0 ; Ċ Ġ* Ġint Ġn 2 = 0 ; Ċ Ġ* Ġint Ġn 3 = 0 ; Ċ Ġ* Ġint Ġn 4 = 0 ; Ġ*/ ĊĊĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ Ċĉĉ ĉ var ĠnewValue Ġ= Ġ( ranks [ i ]- rank Min ). to Long () *( Integer . MAX _ VALUE - rank Min ). to Long () Ċĉĉ ĉ newValue Ġ/= Ġ( rank Max - rank Min ) ĊĊĉĉ ĉ newValue Ġ= Ġmax Of ( min Of ( newValue , Ġ( Integer . MAX _ VALUE - rank Min ). to Long ()), Ġ 0 ) Ċĉĉ ĉ newValue Ġ+= Ġrank Min Ċĉĉ ĉ /* Ġif Ġ( newValue / pas == 0 ){ Ċ Ġ* Ġn 1 ++; Ċ Ġ* Ġ} Ċ Ġ* Ġif Ġ( newValue / pas == 1 ){ Ċ Ġ* Ġn 2 ++; Ċ Ġ* Ġ} Ċ Ġ* Ġif Ġ( newValue / pas == 2 ){ Ċ Ġ* Ġn 3 ++; Ċ Ġ* Ġ} Ċ Ġ* Ġif Ġ( newValue / pas == 3 ){ Ċ Ġ* Ġn 4 ++; Ċ Ġ* Ġ} Ġ*/ Ċĉĉ ĉ ranks [ i ] Ġ= ĠnewValue . toInt () Ċĉ ĉ } Ċĉ ĉ // System . out . println (" n 1 Ġ= Ġ"+ n 1 +" Ġn 2 Ġ= Ġ"+ n 2 +" Ġn 3 Ġ= Ġ"+ n 3 +" Ġn 4 Ġ= Ġ"+ n 4 ); Ċ ĉ } ĊĊ ĉ fun Ġdecode ( surface Num : Int , Ġsurface : IntArray ) Ġ{ ĊĊĉ ĉ var Ġsurface Num Work Ġ= Ġsurface Num Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġsurface Width ) Ġ{ Ċĉĉ ĉ surface [ i ] Ġ= Ġsurface Num Work % base - max Jump Ċĉĉ ĉ surface Num Work Ġ/= Ġbase Ċĉ ĉ } ĊĊ ĉ } ĊĊ ĉ fun Ġiterate Surface ( surface : IntArray , Ġsurface Decoded Work : IntArray ) Ġ{ Ċĉ ĉ set Rank ( surface , Ġsurface Decoded Work ) ĊĊĉ ĉ var Ġret en ue Ġ= Ġ 1 Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġsurface Width ) Ċĉĉ ĉ if ( ret en ue == 0 ) Ċĉĉĉ ĉ break Ċĉĉ ĉ else Ġif ( surface [ i ]< max Jump ) Ġ{ Ċĉĉĉ ĉ surface [ i ] ++ Ċĉĉĉ ĉ surface Decoded Work [ i ] ++ Ċĉĉĉ ĉ ret en ue Ġ= Ġ 0 Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ surface [ i ] Ġ= Ġ- max Jump Ċĉĉĉ ĉ surface Decoded Work [ i ] Ġ= Ġ- max Jump Ċĉĉĉ ĉ ret en ue Ġ= Ġ 1 Ċĉĉ ĉ } ĊĊ ĉ } ĊĊ ĉ private Ġfun Ġget Rank ( surface : IntArray , Ġsurface Decoded Work : IntArray ): Int Ġ{ Ċĉ ĉ var Ġsum Ġ= Ġ 0 L ĊĊĉ ĉ for ( p Ġin Ġ 0 Ġuntil ĠPiece . PI E CE _ STANDARD _ COUNT ) Ġ{ Ċĉĉ ĉ val Ġrank For Piece Ġ= Ġget Rank Piece ( surface , Ġsurface Decoded Work , Ġp ) Ċĉĉ ĉ // System . out . println (" piece Ġ: "+ p +" Ġrank Ġ: Ġ"+ rank For Piece ); Ċĉĉ ĉ sum Ġ+= Ġrank For Piece . to Long () Ċĉ ĉ } Ċĉ ĉ var Ġresult : Int Ċĉ ĉ result Ġ= Ġ( sum / Piece . PI E CE _ STANDARD _ COUNT ). toInt () Ċĉ ĉ synchronized ( this ) Ġ{ Ċĉĉ ĉ if ( result > rank Max ) Ġrank Max Ġ= Ġresult Ċĉĉ ĉ if ( result < rank Min ) Ġrank Min Ġ= Ġresult Ċĉ ĉ } ĊĊĉ ĉ if ( result < 0 ) Ġ{ Ċĉĉ ĉ result Ġ= Ġ 0 Ċĉĉ ĉ println (" ah hh hh h ") Ċĉ ĉ } Ċĉ ĉ return Ġresult Ċ ĉ } ĊĊ ĉ private Ġfun Ġget Rank Piece ( surface : IntArray , Ġsurface Decoded Work : IntArray , Ġpiece : Int ): Int Ġ{ Ċĉ ĉ var Ġbest Rank Ġ= Ġ 0 Ċĉ ĉ for ( r Ġin Ġ 0 Ġuntil ĠP IE CES _ NUM _ ROT ATIONS [ piece ]) Ġ{ Ċĉĉ ĉ val Ġrank Ġ= Ġget Rank Piece Rotation ( surface , Ġsurface Decoded Work , Ġpiece , Ġr ) Ċĉĉ ĉ if ( rank > best Rank ) Ġbest Rank Ġ= Ġrank ĊĊĉ ĉ } Ċĉ ĉ return Ġbest Rank Ċ ĉ } ĊĊ ĉ fun Ġsurface Fits Piece ( surface : IntArray , Ġpiece : Int , Ġrotation : Int , Ġx : Int ): Boolean Ġ{ Ċĉ ĉ var Ġfits Ġ= Ġtrue ĊĊĉ ĉ for ( x 1 Ġin Ġ 0 Ġuntil ĠP IE CES _ WIDTH S [ piece ][ rotation ]- 1 ) Ċĉĉ ĉ if ( surface [ x + x 1 ] != PI EC ES _ LOW EST S [ piece ][ rotation ][ x 1 ]- PI EC ES _ LOW EST S [ piece ][ rotation ][ x 1 + 1 ]) Ġ{ Ċĉĉĉ ĉ fits Ġ= Ġfalse Ċĉĉĉ ĉ break Ċĉĉ ĉ } Ċĉ ĉ return Ġfits Ċ ĉ } ĊĊ ĉ fun Ġsurface Add Possible ( surface Decoded Work : IntArray , Ġpiece : Int , Ġrotation : Int , Ġx : Int ): Boolean Ġ{ Ċĉ ĉ val Ġadd Possible Ġ= Ġtrue Ċĉ ĉ if ( x > 0 ) Ġ{ Ċĉĉ ĉ surface Decoded Work [ x - 1 ] Ġ+= ĠP IE CES _ HEIGHT S [ piece ][ rotation ][ 0 ] Ċĉĉ ĉ if ( surface Decoded Work [ x - 1 ]> max Jump ) Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ else Ġif ( surface Decoded Work [ x - 1 ]< - max Jump ) Ġreturn Ġfalse ĊĊĉ ĉ } ĊĊĉ ĉ for ( x 1 Ġin Ġ 0 Ġuntil ĠP IE CES _ WIDTH S [ piece ][ rotation ]- 1 ) Ġ{ Ċĉĉ ĉ surface Decoded Work [ x + x 1 ] Ġ+= ĠP IE CES _ HEIGHT S [ piece ][ rotation ][ x 1 + 1 ]- PI EC ES _ HEIGHT S [ piece ][ rotation ][ x 1 ] Ċĉĉ ĉ if ( surface Decoded Work [ x + x 1 ]> max Jump ) Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ else Ġif ( surface Decoded Work [ x + x 1 ]< - max Jump ) Ġreturn Ġfalse Ċĉ ĉ } ĊĊĉ ĉ if ( x < surface Width -( PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 )) Ġ{ Ċĉĉ ĉ surface Decoded Work [ x + PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 ] Ġ-= ĠP IE CES _ HEIGHT S [ piece ][ rotation ][ PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 ] Ċĉĉ ĉ if ( surface Decoded Work [ x + PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 ]> max Jump ) Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ else Ġif ( surface Decoded Work [ x + PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 ]< - max Jump ) Ġreturn Ġfalse Ċĉ ĉ } Ċĉ ĉ return Ġadd Possible Ċ ĉ } ĊĊ ĉ fun ĠaddTo Height s ( height s : IntArray , Ġpiece : Int , Ġrotation : Int , Ġx : Int ) Ġ{ Ċĉ ĉ for ( x 1 Ġin Ġ 0 Ġuntil ĠP IE CES _ WIDTH S [ piece ][ rotation ]) Ċĉĉ ĉ height s [ x + x 1 ] Ġ+= ĠP IE CES _ HEIGHT S [ piece ][ rotation ][ x 1 ] ĊĊ ĉ } ĊĊ ĉ fun Ġheight sTo Surface ( height s : IntArray ): IntArray Ġ{ ĊĊĉ ĉ val Ġsurface Ġ= ĠInt Array ( stack Width - 1 ) Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġstack Width - 1 ) Ġ{ Ċĉĉ ĉ var Ġdiff Ġ= Ġheight s [ i + 1 ]- height s [ i ] Ċĉĉ ĉ if ( diff > max Jump ) Ġdiff Ġ= Ġmax Jump Ċĉĉ ĉ if ( diff <- max Jump ) Ġdiff Ġ= Ġ- max Jump Ċĉĉ ĉ surface [ i ] Ġ= Ġdiff Ċĉ ĉ } Ċĉ ĉ return Ġsurface ĊĊ ĉ } ĊĊ ĉ private Ġfun Ġget Rank Piece Rotation ( surface : IntArray , Ġsurface Decoded Work : IntArray , Ġpiece : Int , Ġrotation : Int ): Int Ġ{ ĊĊĉ ĉ var Ġbest Rank Ġ= Ġ 0 Ċĉ ĉ if ( piece == Piece . PI E CE _ I ) Ġ{ Ċĉĉ ĉ val Ġrank Ġ= Ġranks From !!. get Rank Value ( encode ( surface )) Ċĉĉ ĉ if ( rank > best Rank ) Ġbest Rank Ġ= Ġrank ĊĊĉ ĉ } ĊĊĉ ĉ for ( x Ġin Ġ 0 Ġuntil Ġstack Width -( PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 )) Ġ{ Ċĉĉ ĉ val Ġfits Ġ= Ġsurface Fits Piece ( surface Decoded Work , Ġpiece , Ġrotation , Ġx ) ĊĊĉĉ ĉ if ( fits ) Ġ{ Ċĉĉĉ ĉ val Ġadd Possible Ġ= Ġsurface Add Possible ( surface Decoded Work , Ġpiece , Ġrotation , Ġx ) Ċĉĉĉ ĉ if ( add Possible ) Ġ{ Ċĉĉĉĉ ĉ val Ġnew Surface Ġ= Ġencode ( surface Decoded Work ) ĊĊĉĉĉĉ ĉ val Ġrank Ġ= Ġranks From !!. get Rank Value ( new Surface ) Ċĉĉĉĉ ĉ if ( rank > best Rank ) Ġbest Rank Ġ= Ġrank ĊĊĉĉĉ ĉ } ĊĊĉĉ ĉ } Ċĉĉ ĉ // Re init Ġwork Ġsurface Ċĉĉ ĉ if ( x > 0 ) Ġsurface Decoded Work [ x - 1 ] Ġ= Ġsurface [ x - 1 ] Ċĉĉ ĉ System . arraycopy ( surface , Ġx , Ġsurface Decoded Work , Ġx , ĠP IE CES _ WIDTH S [ piece ][ rotation ]- 1 ) Ċĉĉ ĉ if ( x < surface Width -( PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 )) Ċĉĉĉ ĉ surface Decoded Work [ x + PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 ] Ġ= Ġsurface [ x + PI EC ES _ WIDTH S [ piece ][ rotation ]- 1 ] ĊĊĉ ĉ } ĊĊĉ ĉ return Ġbest Rank Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ /** Ġ*/ ĊĊĉ ĉ private Ġconst Ġval ĠserialVersionUID Ġ= Ġ 1 L ĊĊĉ ĉ // Number Ġof Ġdifferent Ġorient ations Ġa Ġpiece Ġcan Ġhave Ġ( this Ġis Ġused Ġto Ġsave Ġcomputing Ġtime ) Ċĉ ĉ val ĠP IE CES _ NUM _ ROT ATIONS Ġ= Ġint ArrayOf ( 2 , Ġ// ĠI Ċĉĉĉ 4 , Ġ// ĠL Ċĉĉĉ 1 , Ġ// ĠO Ċĉĉĉ 2 , Ġ// ĠZ Ċĉĉĉ 4 , Ġ// ĠT Ċĉĉĉ 4 , Ġ// ĠJ Ċĉĉĉ 2 , Ġ// ĠS Ċĉĉĉ 1 , Ġ// ĠI 1 Ċĉĉĉ 2 , Ġ// ĠI 2 Ċĉĉĉ 2 , Ġ// ĠI 3 Ċĉĉĉ 4 Ġ// ĠL 3 Ċĉ ĉ ) ĊĊĉ ĉ val ĠP IE CES _ LEFT MO STS Ġ= ĠarrayOf ( int ArrayOf ( 0 , Ġ 2 , Ġ 0 , Ġ 1 ), Ġ// ĠI Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 0 ), Ġ// ĠL Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ), Ġ// ĠO Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 0 ), Ġ// ĠZ Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 0 ), Ġ// ĠT Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 0 ), Ġ// ĠJ Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 0 ), Ġ// ĠS Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ), Ġ// ĠI 1 Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 0 ), Ġ// ĠI 2 Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 1 ), Ġ// ĠI 3 Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) Ġ// ĠL 3 Ċĉ ĉ ) Ċĉ ĉ val ĠP IE CES _ RIGHT MO STS Ġ= ĠarrayOf ( int ArrayOf ( 3 , Ġ 2 , Ġ 3 , Ġ 1 ), Ġ// I Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 1 ), Ġ// L Ċĉĉ ĉ int ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 ), Ġ// O Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 1 ), Ġ// Z Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 1 ), Ġ// T Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 1 ), Ġ// J Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 1 ), Ġ// S Ċĉĉ ĉ int ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ), Ġ// I 1 Ċĉĉ ĉ int ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 0 ), Ġ// I 2 Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 1 , Ġ 2 , Ġ 1 ), Ġ// I 3 Ċĉĉ ĉ int ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 )) // L 3 ĊĊĉ ĉ val ĠP IE CES _ WIDTH S Ġ= ĠarrayOf ( int ArrayOf ( 4 , Ġ 1 , Ġ 4 , Ġ 1 ), Ġ// I Ċĉĉ ĉ int ArrayOf ( 3 , Ġ 2 , Ġ 3 , Ġ 2 ), Ġ// L Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 2 ), Ġ// O Ċĉĉ ĉ int ArrayOf ( 3 , Ġ 2 , Ġ 3 , Ġ 2 ), Ġ// Z Ċĉĉ ĉ int ArrayOf ( 3 , Ġ 2 , Ġ 3 , Ġ 2 ), Ġ// T Ċĉĉ ĉ int ArrayOf ( 3 , Ġ 2 , Ġ 3 , Ġ 2 ), Ġ// J Ċĉĉ ĉ int ArrayOf ( 3 , Ġ 2 , Ġ 3 , Ġ 2 ), Ġ// S Ċĉĉ ĉ int ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 ), Ġ// I 1 Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 1 , Ġ 2 , Ġ 1 ), Ġ// I 2 Ċĉĉ ĉ int ArrayOf ( 3 , Ġ 1 , Ġ 3 , Ġ 1 ), Ġ// I 3 Ċĉĉ ĉ int ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 2 ) Ġ// L 3 Ċĉ ĉ ) ĊĊĉ ĉ val ĠP IE CES _ HEIGHT S Ġ= ĠarrayOf ( array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 4 ), Ġint ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 4 )), Ġ// I Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 2 ), Ġint ArrayOf ( 3 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 3 )), Ġ// L Ċĉĉ ĉ array Of ( int ArrayOf ( 2 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 2 )), Ġ// O Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 2 ), Ġint ArrayOf ( 1 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 2 )), Ġ// Z Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 3 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 3 )), Ġ// T Ċĉĉ ĉ array Of ( int ArrayOf ( 2 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 3 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 , Ġ 2 ), Ġint ArrayOf ( 1 , Ġ 3 )), Ġ// J Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 2 ), Ġint ArrayOf ( 1 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 2 )), Ġ// S Ċĉĉ ĉ array Of ( int ArrayOf ( 1 ), Ġint ArrayOf ( 1 ), Ġint ArrayOf ( 1 ), Ġint ArrayOf ( 1 )), Ġ// I 1 Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 ), Ġint ArrayOf ( 2 ), Ġint ArrayOf ( 1 , Ġ 1 ), Ġint ArrayOf ( 2 )), Ġ// I 2 Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 3 ), Ġint ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 3 )), Ġ// I 3 Ċĉĉ ĉ array Of ( int ArrayOf ( 2 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 2 ), Ġint ArrayOf ( 1 , Ġ 2 )) Ġ// L 3 Ċĉ ĉ ) Ċĉ ĉ val ĠP IE CES _ LOW EST S Ġ= ĠarrayOf ( array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 3 ), Ġint ArrayOf ( 2 , Ġ 2 , Ġ 2 , Ġ 2 ), Ġint ArrayOf ( 3 )), Ġ// I Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 0 , Ġ 2 )), Ġ// L Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 )), Ġ// O Ċĉĉ ĉ array Of ( int ArrayOf ( 0 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 2 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 1 )), Ġ// Z Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 2 )), Ġ// T Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 0 ), Ġint ArrayOf ( 1 , Ġ 1 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 2 )), Ġ// J Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 0 ), Ġint ArrayOf ( 1 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 2 )), Ġ// S Ċĉĉ ĉ array Of ( int ArrayOf ( 0 ), Ġint ArrayOf ( 0 ), Ġint ArrayOf ( 0 ), Ġint ArrayOf ( 0 )), Ġ// I 1 Ċĉĉ ĉ array Of ( int ArrayOf ( 0 , Ġ 0 ), Ġint ArrayOf ( 1 ), Ġint ArrayOf ( 1 , Ġ 1 ), Ġint ArrayOf ( 1 )), Ġ// I 2 Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 2 ), Ġint ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 2 )), Ġ// I 3 Ċĉĉ ĉ array Of ( int ArrayOf ( 1 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 )) Ġ// L 3 Ċĉ ĉ ) Ċ ĉ } Ċ } Ċ