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 16, 2022Diamond Contributor
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 )
));
Patrick2788
Jul 16, 2022Silver Contributor
Thank you for the examples. I really need to improve on recursion. I've been doing some things the long way and can refine my methods much more!