package Ġcc . z eng t ian . mt t . theory Ċ Ċ import Ġkotlinx . serialization . Serializable Ċ Ċ @ Serializable Ċ class ĠScale Ġprivate Ġconstructor ( val Ġname : ĠString , Ġval Ġsteps : ĠList < Int >) Ġ{ ĊĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠMA JOR Ġ= ĠScale (" Major ( Ion ian )", Ġ 2 , Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval ĠD OR IAN Ġ= ĠScale (" D orian ", Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval ĠP HR YG IAN Ġ= ĠScale (" Ph ry g ian ", Ġ 1 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval ĠL Y DIAN Ġ= ĠScale (" Ly dian ", Ġ 2 , Ġ 2 , Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval ĠM IX OLY DIAN Ġ= ĠScale (" Mix oly dian ", Ġ 2 , Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval ĠMIN OR Ġ= ĠScale (" Minor ( Ae ol ian )", Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval ĠLO CR IAN Ġ= ĠScale (" Loc rian ", Ġ 1 , Ġ 2 , Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval ĠH AR MON IC _ MINOR Ġ= ĠScale (" Har monic ĠMinor ", Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 1 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval ĠME LOD IC _ MINOR _ ASC END Ġ= ĠScale (" Me lo dic ĠMinor ĠAsc ending ", Ġ 2 , Ġ 1 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval ĠP ENT AT ON IC Ġ= ĠScale (" P ent at onic ", Ġ 2 , Ġ 2 , Ġ 3 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval ĠCH ROM AT IC Ġ= ĠScale (" Chrom atic ", Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBU IL T _ INS Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMA JOR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD OR IAN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP HR YG IAN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL Y DIAN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM IX OLY DIAN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMIN OR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLO CR IAN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠH AR MON IC _ MINOR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠME LOD IC _ MINOR _ ASC END , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ENT AT ON IC , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCH ROM AT IC ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuilt In Values () Ġ= ĠBU IL T _ INS ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġconstructor ( name : ĠString , Ġvar arg Ġsteps Arr : ĠInt ) Ġ: Ġthis ( name , Ġsteps Arr . toList ()) ĊĊĠĠĠ Ġprivate Ġval Ġsteps To Root : ĠList < Int > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinc Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġinc . add ( 0 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( step Ġin Ġsteps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinc . add ( inc [ inc . size Ġ- Ġ 1 ] Ġ+ Ġstep ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstep Pair To Major : ĠList < Pair < Int , ĠAcc ident al ? >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmajor To Root Ġ= ĠMA JOR . steps To Root ĊĠĠĠĠĠĠĠ Ġval Ġthis To Root Ġ= Ġsteps To Root ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Pair < Int , ĠAcc ident al ?> ? >( this To Root . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( idx Ġin Ġthis To Root . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( idx Ġin Ġthis To Root . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġthis To Root [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( major To Root . contains ( distance )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ idx ] Ġ= ĠPair ( major To Root . indexOf ( distance ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( idx Ġin Ġresult . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result [ idx ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun resolved Ġ= Ġthis To Root [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsmaller In Major Ġ= Ġmajor To Root . find Ġ{ Ġun resolved Ġ- Ġit Ġ== Ġ 1 Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbigger In Major Ġ= Ġmajor To Root . find Ġ{ Ġit Ġ- Ġun resolved Ġ== Ġ 1 Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this To Root . contains ( smaller In Major ) Ġ&& Ġthis To Root . contains ( big ger In Major )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġbetter Ġways Ġto Ġdetermine Ġsh arp Ġor Ġflat ï¼Ł ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ idx ] Ġ= ĠPair ( major To Root . indexOf ( big ger In Major ), ĠAcc ident al . FLAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! this To Root . contains ( smaller In Major ) Ġ&& Ġ! this To Root . contains ( big ger In Major )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġbetter Ġways Ġto Ġdetermine Ġsh arp Ġor Ġflat ï¼Ł ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ idx ] Ġ= ĠPair ( major To Root . indexOf ( big ger In Major ), ĠAcc ident al . FLAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( this To Root . contains ( smaller In Major )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ idx ] Ġ= ĠPair ( major To Root . indexOf ( big ger In Major ), ĠAcc ident al . FLAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ idx ] Ġ= ĠPair ( major To Root . indexOf ( smaller In Major ), ĠAcc ident al . SH ARP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġresult Ġas ĠList < Pair < Int , ĠAcc ident al ? >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnote Count : ĠInt Ġby Ġlazy Ġ{ Ġsteps . size Ġ+ Ġ 1 Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( steps . isNotEmpty ()) Ġ{ Ġ" steps Ġcan 't Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( steps . count Ġ{ Ġit Ġ<= Ġ 0 Ġ} Ġ== Ġ 0 ) Ġ{ Ġ" step Ġmust Ġ> Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( steps . sum () Ġ< Ġ 1 2 ) Ġ{ Ġ" steps Ġsum Ġmust Ġ< Ġ 1 2 " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġname ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠScale ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( steps Ġ!= Ġother . steps ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsteps . hashCode () ĊĠĠĠ Ġ} Ċ } Ċ