package Ġle et code Ċ Ċ import Ġlib .* Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api .* Ċ import Ġorg . junit . jupiter . params .* Ċ import Ġorg . junit . jupiter . params . converter .* Ċ import Ġorg . junit . jupiter . params . provider .* Ċ Ċ /** Ċ Ġ* Ġhttps :// leetcode . com / problems / word - search / Ċ Ġ* Ċ Ġ* Ġ 7 9 . ĠWord ĠSearch Ċ Ġ* Ġ[ Medium ] Ċ Ġ* Ċ Ġ* ĠGiven Ġan Ġm Ġx Ġn Ġboard Ġand Ġa Ġword , Ġfind Ġif Ġthe Ġword Ġexists Ġin Ġthe Ġgrid . Ċ Ġ* Ċ Ġ* ĠThe Ġword Ġcan Ġbe Ġconstructed Ġfrom Ġletters Ġof Ġse quent ially Ġadjacent Ġcells , Ċ Ġ* Ġwhere Ġ" adjacent " Ġcells Ġare Ġh orizontally Ġor Ġvert ically Ġne ighb oring . Ċ Ġ* ĠThe Ġsame Ġletter Ġcell Ġmay Ġnot Ġbe Ġused Ġmore Ġthan Ġonce . Ċ Ġ* Ċ Ġ* ĠConstraints : Ċ Ġ* Ġ- Ġm Ġ== Ġboard . length Ċ Ġ* Ġ- Ġn Ġ= Ġboard [ i ]. length Ċ Ġ* Ġ- Ġ 1 Ġ<= Ġm , Ġn Ġ<= Ġ 2 0 0 Ċ Ġ* Ġ- Ġ 1 Ġ<= Ġword . length Ġ<= Ġ 1 0 ^ 3 Ċ Ġ* Ġ- Ġboard Ġand Ġword Ġconsists Ġonly Ġof Ġlowercase Ġand Ġuppercase ĠEnglish Ġletters . Ċ Ġ*/ Ċ type alias ĠBoard Ġ= ĠArray < String > Ċ type alias ĠCoordinates Ġ= ĠSequence < XY > Ċ type alias ĠPath Ġ= ĠCoordinates Ċ Ċ fun Ġfind Words On Board ( board : ĠBoard , Ġwords : ĠList < String >) Ġ= ĊĠĠĠ Ġwords . filter Ġ{ Ġboard Contains Word ( board , Ġit ) Ġ} Ċ Ċ fun Ġboard Contains Word ( board : ĠBoard , Ġword : ĠString ) Ġ= Ġboard . find Path ( word ). any () Ġ// Ġfor Ġle et code Ċ Ċ fun ĠBoard . find Path ( word : ĠString , Ġx ys : ĠCoordinates Ġ= Ġx ys (), Ġpath : ĠPath Ġ= Ġempty Sequence ()): ĠPath Ġ= ĊĠĠĠ Ġif Ġ( word . isEmpty ()) Ġpath ĊĠĠĠ Ġelse Ġx ys ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġword . first () Ġ== Ġmaybe Value ( it ) Ġ&& Ġit Ġ! in Ġpath Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfind Path ( word . drop ( 1 ), Ġit . neighbors (), Ġpath Ġ+ Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . any () Ġ} ĊĠĠĠĠĠĠĠ Ġ. or Empty () Ċ Ċ private Ġfun ĠBoard . x ys () Ġ= ĊĠĠĠ Ġas Sequence (). flatMap Indexed Ġ{ Ġy , Ġr Ġ-> Ġr . map Indexed Ġ{ Ġx , Ġ_ Ġ-> ĠXY ( x , Ġy ) Ġ} Ġ} Ċ Ċ private Ġfun ĠBoard . maybe Value ( xy : ĠXY ) Ġ= Ġget OrNull ( xy . y )?. get OrNull ( xy . x ) Ċ Ċ data Ġclass ĠXY ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ġ{ ĊĊĠĠĠ Ġfun Ġneighbors () Ġ= Ġsequence Of ( right (), Ġdown (), Ġup (), Ġleft ()) ĊĊĠĠĠ Ġfun Ġup () Ġ= Ġcopy ( y Ġ= Ġy Ġ- Ġ 1 ) ĊĠĠĠ Ġfun Ġright () Ġ= Ġcopy ( x Ġ= Ġx Ġ+ Ġ 1 ) ĊĠĠĠ Ġfun Ġdown () Ġ= Ġcopy ( y Ġ= Ġy Ġ+ Ġ 1 ) ĊĠĠĠ Ġfun Ġleft () Ġ= Ġcopy ( x Ġ= Ġx Ġ- Ġ 1 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠUnit Ġtests Ċ Ġ*/ Ċ class ĠWord s Inside AR ect angle Test Ġ{ ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Csv Source ( ĊĠĠĠĠĠĠĠ Ġ"[ K OTE , ĠN ULE , ĠA FIN ]; Ġ[ Kotlin , Ġfun , Ġfile , Ġline , Ġnull ]; Ġ[ K OT LIN , ĠFUN , ĠFILE , ĠLINE ]", ĊĠĠĠĠĠĠĠ Ġ"[ AB CE , ĠSF CS , ĠA DE E ]; Ġ[ AB CC ED , ĠS EE , ĠAB CB ]; Ġ[ AB CC ED , ĠS EE ]", Ġ// ĠAB CB Ġcan Ġonly Ġbe Ġfound Ġby Ġvisit ing Ġa Ġcell Ġtwice ĊĠĠĠĠĠĠĠ Ġdelimiter Ġ= Ġ';' ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġ` find s Ġwords Ġon Ġboard Ġby Ġfinding Ġa Ġpath Ġof Ġadjacent Ġcells Ġstarting Ġanywhere `( ĊĠĠĠĠĠĠĠ Ġ@ Convert With ( String Array Arg :: class ) Ġboard : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġ@ Convert With ( String Array Arg :: class ) Ġwords : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġ@ Convert With ( String Array Arg :: class ) Ġexpected Words : ĠArray < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Words On Board ( board , Ġwords . map Ġ{ Ġit . uppercase () Ġ}) ĊĠĠĠĠĠĠĠ Ġ). contains Exactly Elements Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Words . toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }