package Ġclassic c spro blems kotlin . chapter 3 Ċ Ċ class ĠWord Grid ( val Ġrows : ĠInt , Ġval Ġcolumns : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġgrid Ġ= ĠChar Array ( rows Ġ* Ġcolumns ) Ġ{ Ġrandom Alphabet ic . first () Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠGrid Location ( val Ġrow : ĠInt , Ġval Ġcolumn : ĠInt ) ĊĊĠĠĠ Ġfun Ġmark ( word : ĠString , Ġlocations : ĠList < Grid Location >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocations . zip ( word . toList ()). forEach Ġ{ Ġ( loc , Ġc ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid [ loc . column Ġ+ Ġloc . row Ġ* Ġcolumns ] Ġ= Ġc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġgrid . toList (). chunk ed ( columns ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("\ n ") Ġ{ Ġit . join ToString ("") Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Domain ( word : ĠString ): ĠList < List < Grid Location >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdomain Ġ= Ġmutable ListOf < List < Grid Location >>() ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġword . length ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġrows ). flatMap Ġ{ Ġr Ġ-> Ġ( 0 Ġuntil Ġcolumns ). map Ġ{ Ġc Ġ-> Ġr Ġto Ġc Ġ} Ġ}. forEach Ġ{ Ġ( row , Ġcolumn ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Ġ+ Ġlength Ġ<= Ġcolumns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġleft Ġto Ġright ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ+= Ġfill Right ( row , Ġcolumn , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdiagonal Ġtowards Ġbottom Ġright ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ+ Ġlength Ġ<= Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ+= Ġfill Diag onal Right ( row , Ġcolumn , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ+ Ġlength Ġ<= Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtop Ġto Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ+= Ġfill Down ( row , Ġcolumn , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdiagonal Ġtowards Ġbottom Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Ġ- Ġlength Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ+= Ġfill Diag onal Left ( row , Ġcolumn , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdomain ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Right ( row : ĠInt , Ġcolumn : ĠInt , Ġlength : ĠInt ): ĠList < Grid Location > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( column Ġuntil Ġcolumn Ġ+ Ġlength ). map Ġ{ Ġc Ġ-> ĠGrid Location ( row , Ġc ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Diag onal Right ( row : ĠInt , Ġcolumn : ĠInt , Ġlength : ĠInt ): ĠList < Grid Location > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( column Ġuntil Ġcolumn Ġ+ Ġlength ). map Indexed Ġ{ Ġindex , Ġc Ġ-> ĠGrid Location ( row Ġ+ Ġindex , Ġc ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Down ( row : ĠInt , Ġcolumn : ĠInt , Ġlength : ĠInt ): ĠList < Grid Location > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( row Ġuntil Ġrow Ġ+ Ġlength ). map Ġ{ Ġr Ġ-> ĠGrid Location ( r , Ġcolumn ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Diag onal Left ( row : ĠInt , Ġcolumn : ĠInt , Ġlength : ĠInt ): ĠList < Grid Location > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( row Ġuntil Ġrow Ġ+ Ġlength ). map Indexed Ġ{ Ġindex , Ġr Ġ-> ĠGrid Location ( r , Ġcolumn Ġ+ Ġindex ) Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAL PH AB ET _ LENGTH Ġ= Ġ 2 6 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFIRST _ LET TER Ġ= Ġ' A ' ĊĊĠĠĠĠĠĠĠ Ġval Ġrandom Alphabet ic Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( FIRST _ LET TER Ġ+ Ġ( 0 Ġuntil ĠAL PH AB ET _ LENGTH ). random ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġword Grid Ġ= ĠWord Grid ( 9 , Ġ 9 ) ĊĠĠĠ Ġprintln ( word Grid ) ĊĠĠĠ Ġprintln () ĊĠĠĠ Ġval Ġwords Ġ= ĠlistOf (" M ATT HE W ", Ġ" JO E ", Ġ" MARY ", Ġ" SAR AH ", Ġ" S ALLY ") ĊĠĠĠ Ġval Ġdomains Ġ= Ġwords . map Ġ{ Ġit Ġto Ġword Grid . generate Domain ( it ) Ġ}. toMap () ĊĊĠĠĠ Ġval Ġc sp : ĠC SP < String , ĠList < Word Grid . Grid Location >> Ġ= ĠC SP ( words , Ġdomains ) ĊĠĠĠ Ġc sp Ġ+= ĠWord Search Constraint ( words ) ĊĊĠĠĠ Ġval Ġsolution Ġ= Ġc sp . back tracking Search () ĊĊĠĠĠ Ġif ( solution Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" No Ġsolution Ġfound !") ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsolution . forEach Ġ{ Ġ( word , Ġlocations ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreverse Ġ= ĠlistOf ( true , Ġfalse ). random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġword Grid . mark ( word , Ġif ( reverse ) Ġlocations . reversed () Ġelse Ġlocations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ( word Grid ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ