Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

In this Discussion

Coding problem

in Questions Posts: 126

Trying to make a function that finds the concatenation of words in a table or array.
So basically in the table below the answer printed should be catsdog because cats ,dog, and catsdog are in the table
I made a simple function to do this but how do I make a better function so that if I run the function with any string table it finds the answer without me having to manually put in x=2,y=3..etc

function setup()
    input = {"cat","cats","dog","catsdog",}
    findconcat(input)      
end        

function findconcat(array)
        x=2
        y=3
        z=4
    if array[x]..array[y]==array[z] then
        print(array[z])
    end
end

Comments

  • dave1707dave1707 Mod
    Posts: 8,456

    @Jarc You’re going to have to do multiple loops thru the table checking each word with each other. Or you could create a string and do string searches. There are a few problems I see with this. What should you do if you have words like {art,he,ear,hear,heart,heartbeat}. If a word is matched, should it be used again somewhere else. This isn’t exactly what I’m thinking of, but one word could be made of multiple other words that are also made of smaller words.

  • dave1707dave1707 Mod
    edited June 24 Posts: 8,456

    @Jarc Thanks for a very interesting problem. It kept me busy for awhile. I originally wrote the code using a brute force method. It worked, but it would take a long time as the number of words in the table increased. What I was doing was to create a phrase using a combination of all the words and compare that phrase to the target word. It worked, but like I said, as the list increased, so did the time. Plus the code was quite large. Once I knew it could work, I had to change how I was doing it. Instead of creating phrases to compare, I would take the target word and then take each word in the table and see if it was within the target and get the correct combination of words to match the target. That also worked, but the code was again large. That’s when I decided to use recursive code which I don’t do very often. That’s what I liked about your problem, I was able to use recursion. So here’s the code. It’s a lot smaller that my original versions. The word table is shown vertically on the screen and the word combinations are shown in the print area. The target word (each word in the table) is shown in ( ) and the other table words are separated with a —.

    It’s coded now to use your original word table which doesn’t do much, but you can comment out the wordTabs to get to my table that I used to write the code. That uses a lot of word combinations. I added a few more letters/word to your original table for the second wordTab as you work towards mine.

    Updated code below
    
  • dave1707dave1707 Mod
    Posts: 8,456

    Made the code smaller.

    displayMode(STANDARD)
    
    function setup()
        fill(255)
        wordTab={"be","at","b","hear","beat","bart","heart","ar","t",
                "he","art","eat","h","ear","heartbeat","heat"}
    
        wordTab = {"cat","cats","dog","catsdog","at","c","do","g","s"}
    
        wordTab = {"cat","cats","dog","catsdog"}
    
        --table.sort(wordTab)
        for z=1,#wordTab do
            printTab={}
            wordFind(1,wordTab[z],printTab)
        end 
        txt=table.concat(wordTab,"\n\n")
    end
    
    function wordFind(startPos,word,pTab)
        for z=1,#wordTab do
            if wordTab[z]~=word then
                local s,e=string.find(word,wordTab[z],startPos,true)
                if s==startPos then
                    table.insert(pTab,wordTab[z])
                    if e==#word then
                        print("("..word..") ",table.concat(pTab,"-"))
                        table.remove(pTab)
                    else
                        wordFind(e+1,word,pTab)
                    end           
                end
            end
        end
        table.remove(pTab)
    end
    
    function draw()
        background(0)
        text(txt,WIDTH/2,HEIGHT/2)
    end
    
Sign In or Register to comment.