package Ġcom . github . ach raf amil . spl endor . api . rules Ċ Ċ import Ġcom . github . ach raf amil . spl endor . api . data . Board State Ċ import Ġcom . github . ach raf amil . spl endor . api . data . N ob le Ċ import Ġcom . github . ach raf amil . spl endor . api . data . Player State Ċ import Ġcom . github . ach raf amil . spl endor . api . data . Transaction Ċ import Ġkotlin . math . max Ċ Ċ /** Ċ Ġ* Ġ@ return Ġtrue Ġif Ġ[ this ] Ġtoken Ġexchange Ġtransaction Ġis Ġeither Ċ Ġ* Ġ" up Ġto Ġ 3 Ġtokens Ġfrom Ġdifferent Ġcolors " Ġor Ġ" two Ġtokens Ġfrom Ġsame Ġcolor ". Ċ Ġ*/ Ċ fun ĠTransaction . Tokens Exchange . isValid (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġstrictly Positive Values Count Ġ= Ġtokens . values . count Ġ{ Ġit Ġ> Ġ 0 Ġ} ĊĊĠĠĠ Ġ// Ġmake Ġsure : Ġat Ġmost Ġ 3 Ġstrictly Ġpositive Ġvalues , Ġand Ġstrictly Ġpositive Ġvalues Ġare Ġeither Ġ 1 Ġor Ġ 2 ĊĠĠĠ Ġif Ġ( strict ly Positive Values Count Ġ> Ġ 3 ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( tokens . values . any Ġ{ Ġit Ġ> Ġ 2 Ġ}) Ġreturn Ġfalse ĊĊĠĠĠ Ġ// Ġeither Ġat Ġmost Ġone Ġtoken Ġby Ġcolor Ġfrom Ġat Ġmost Ġ 3 Ġcolors , ĊĠĠĠ Ġ// Ġor Ġ 2 Ġtokens Ġfrom Ġthe Ġsame Ġcolor ĊĠĠĠ Ġreturn Ġ( tokens . values . none Ġ{ Ġit Ġ== Ġ 2 Ġ} Ġ|| Ġstrictly Positive Values Count Ġ<= Ġ 1 ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ return Ġtrue Ġif Ġtransaction Ġdoes Ġrespect Ġall Ġthe Ġrules Ġ( valid , Ġaff ord able , Ġetc ). Ċ Ġ* Ċ Ġ* ĠCheck Ġthe Ġofficial ĠSpl endor ĠGame Ġrules Ġonline . Ċ Ġ*/ Ċ fun ĠBoard State . player Can Submit Transaction ( ĊĠĠĠ Ġplayer State : ĠPlayer State , ĊĠĠĠ Ġtransaction : ĠTransaction Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠTransaction . Card Buy ing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġboard Ġor Ġuser Ġre servations Ġcontain Ġthis Ġcard , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġuser Ġcan Ġaff ord Ġit . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard Ġ= Ġcards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( player State . reserved Cards ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . id Ġ== Ġtransaction . card Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcost Gap Ġ= Ġcard ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cost ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( color , Ġcard Cost ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcards Of Same Color Count Ġ= Ġplayer State . cards . count Ġ{ Ġit . color Ġ== Ġcolor Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtokens Of Same Color Count Ġ= Ġplayer State . tokens [ color ] Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( 0 , Ġcard Cost Ġ- Ġtokens Of Same Color Count Ġ- Ġcards Of Same Color Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cost Gap Ġ> Ġplayer State . gold s ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠTransaction . Card Reservation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġboard Ġdoes Ġcontain Ġthis Ġcard , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġuser Ġhas Ġless Ġthan Ġ 3 Ġreserved Ġcards . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboard DoesNot Contain Card Ġ= Ġcards . values . flatten (). none Ġ{ Ġit . id Ġ== Ġtransaction . card Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Has Three Or More Reserved Cards Ġ= Ġplayer State . reserved Cards . size Ġ>= Ġ 3 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( board DoesNot Contain Card Ġ|| Ġuser Has Three Or More Reserved Cards ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠTransaction . Tokens Exchange Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! transaction . isValid ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġboard Ġhas Ġenough Ġtokens Ġto Ġoffer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġplayer Ġhas Ġenough Ġtokens Ġto Ġreturn , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- Ġand Ġ' 2 Ġtokens Ġfrom Ġsame Ġcolor ' Ġtransactions Ġare Ġon Ġcolors Ġwith Ġat Ġleast Ġ 4 Ġavailable Ġtokens . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . tokens . forEach Ġ{ Ġ( color , Ġtransaction Color Tokens Count ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboard Color Tokens Count Ġ= Ġthis . tokens [ color ] Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Color Tokens Count Ġ= Ġplayer State . tokens [ color ] Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboard Has En ough Tokens Ġ= Ġboard Color Tokens Count Ġ- Ġtransaction Color Tokens Count Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Has En ough Tokens Ġ= Ġplayer Color Tokens Count Ġ+ Ġtransaction Color Tokens Count Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Two Tokens From Color With LessThan Four Ġ= Ġtransaction Color Tokens Count Ġ== Ġ 2 Ġ&& Ġboard Color Tokens Count Ġ< Ġ 4 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! board Has En ough Tokens Ġ|| Ġ! player Has En ough Tokens Ġ|| Ġis Two Tokens From Color With LessThan Four ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPlus , Ġmake Ġsure Ġplayer 's Ġwon 't Ġhave Ġmore Ġthan Ġ$ TOKEN S _ LIMIT _ BY _ PLAYER Ġtokens Ġafter Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction . tokens . values . sum () Ġ+ Ġplayer State . tokens . values . sum () Ġ> ĠTOKEN S _ LIMIT _ BY _ PLAYER ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ fun ĠPlayer State . can Aff ord N ob le ( nob le : ĠN ob le ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġn ob le . cost . all Ġ{ Ġ( color , Ġcards Needed Count ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġplayer Cards Of The Same Color Ġ= Ġthis . cards . filter Ġ{ Ġcard Ġ-> Ġcard . color Ġ== Ġcolor Ġ} ĊĠĠĠĠĠĠĠ Ġplayer Cards Of The Same Color . size Ġ>= Ġcards Needed Count ĊĠĠĠ Ġ} Ċ } Ċ Ċ const Ġval ĠTOKEN S _ LIMIT _ BY _ PLAYER Ġ= Ġ 1 0 Ċ