Forum Discussion
Patrick2788
Jul 14, 2022Silver Contributor
A LAMBDA Word Search Puzzle
I've created a 15x10 Word Search. I've included a word list (dynamic range) containing words which might be found in the word search. The goal is to then extract those words when they appear in the...
- Jul 16, 2022
Here is one more variant
//------ variant without TEXTJOIN() reverseColumns= LAMBDA( data, LET( n, COLUMNS( data ), CHOOSECOLS( data, SEQUENCE(n,,n,-1) ) )); reversedText= LAMBDA( str, LET( head, LEFT(str), tail, RIGHT(str, LEN(str) - 1), IF(str = "", "", reversedText(tail) & head) )); isPolindrom= LAMBDA( text, text = reversedText( text ) ); checkSingleWord= LAMBDA( str, vector, LET( getWord, REDUCE("", vector, LAMBDA( a,v, IF( LEFT(str, LEN(a&v)) = a&v, a&v, IF( LEFT(str) = a, v, IF( a = str, a, "" ) ) ) ) ), IF( getWord = str, str, "") )); checkListOfWords= LAMBDA( wordsVector, vector, LET( getWords, REDUCE("", wordsVector, LAMBDA(a,v, VSTACK(a, checkSingleWord( v, vector) ) ) ), IFERROR( FILTER( getWords, getWords <> ""), "" ) )); wordsInMatrix= LAMBDA( data, wordsVector, LET( k, SEQUENCE( ROWS(data) ), scanData, REDUCE(1, k, LAMBDA(a,v, CHOOSECOLS( IF( v < SEQUENCE(,v,v,-1), a, VSTACK(a, checkListOfWords( Words, CHOOSEROWS(data,v) ) ) ), 1 ) )), removeFirst, DROP( scanData, 1 ), FILTER( removeFirst, removeFirst <> "") )); wordsInPuzzle= LAMBDA( data, wordsVector, LET( allWords, SORT( VSTACK( wordsInMatrix( data, wordsVector ), wordsInMatrix( reverseColumns( data ), wordsVector ), wordsInMatrix( TRANSPOSE( data ), wordsVector ), wordsInMatrix( reverseColumns( TRANSPOSE( data ) ), wordsVector ) )), ifPolindroms, MAP(allWords, LAMBDA(v, isPolindrom(v) ) ), polindroms, UNIQUE( FILTER(allWords, ifPolindroms)), notPolindroms, FILTER(allWords, ifPolindroms -1), stack, IF( ISERR(polindroms), notPolindroms, VSTACK( polindroms, notPolindroms ) ), SORT( stack ) ));
SergeiBaklan
Jul 14, 2022Diamond Contributor
Perhaps close to PeterBartholomew1 latest idea
checkWord=
LAMBDA( str, vector,
LET(
getIt, IF( ISNUMBER( SEARCH( str, TAKE( vector, 1))), str, ""),
IF(
ROWS( vector ) = 1,
getIt,
VSTACK( getIt, checkWord( str, DROP( vector, 1)) )
)));
checkWords=
LAMBDA( wordsVector, vector,
LET(
a, checkWord( TAKE( wordsVector, 1), vector),
IF(
ROWS( wordsVector ) = 1,
a,
VSTACK( a, checkWords( DROP( wordsVector, 1), vector) )
)) );
reverseRow=
LAMBDA( r,
LET(
n, COLUMNS( r ),
INDEX(r,SEQUENCE(,n,n,-1))
) );
wordsFoundInPuzzle=
LAMBDA( data, wordsVector,
LET(
combinedVector, VSTACK(
BYROW(data, LAMBDA(v, TEXTJOIN("",,v) ) ),
BYROW(data, LAMBDA(v, TEXTJOIN("",, reverseRow( v )) ) ),
TOCOL( BYCOL(data, LAMBDA(v, TEXTJOIN("",,v) ) ) ),
TOCOL( BYCOL(data, LAMBDA(v, TEXTJOIN("",, reverseRow( TOROW(v) )) ) ) )
),
withBlanks, checkWords( wordsVector, combinedVector ),
return, FILTER( withBlanks, withBlanks <> ""),
return
));