Forum Discussion

Patrick2788's avatar
Patrick2788
Silver Contributor
Jul 14, 2022

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...
  • SergeiBaklan's avatar
    SergeiBaklan
    Jul 16, 2022

    Patrick2788 

    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 )
    ));
    

Resources