More effective Lua way of this algorithm?

Hi,

every programming language has it’s best way of implementing things. Looking at my rather standard/basic implementarion of this ‘every one with everyone in both ways’ I would like to know if there is a best Lua way for this?

flubs ={1,2,3,4,5}

max = (#flubs*(#flubs-1))
print(max)
c = 1 -- only for loopcount
for i=1, #flubs do
    local k = i + 1
    for y = 1, #flubs-1 do
        if (k>#flubs) then k=1 end
        print(c .. ": " .. flubs[i] .. " - " .. flubs[k])
        k = k + 1
        c = c + 1 -- only for loopcount
    end
end

Many thanks

You’re looking for all pair combinations.

I’m not sure there’s any special Lua way, but I would have just done this

flubs ={1,2,3,4,5}
max = (#flubs*(#flubs-1))
print(max)
for i=1, #flubs do
    for k = 1, #flubs do
        if (i~=k) then print(c .. ": " .. flubs[i] .. " - " .. flubs[k]) end
    end
end

Wow, I don’t know if this is the best Lua way, but it surely is much cleaner than my code.
Thanks!

If you want to use more lua functionality instead of just two simple loops, you could do something like this. It’s not more efficient, just looks nicer when you actually use it:

function mypairs(t)
    return coroutine.wrap(function() 
        local c = 1
        for i = 1, #t do
            for j = 1, #t do
                if t[i] ~= t[j] then
                    coroutine.yield(c, t[i]..t[j])
                    c = c + 1
                end
            end
        end
    end)
end

flubs = {1, 2, 3, 4, 5}
for i, v in mypairs(flubs) do print(i..":", v) end

Lua lacks functionality other languages have that make things like this look more elegant, but that doesn’t mean two for loops are less efficient than a call to a complex library function.

Nahhh, I think I’ll stick with Ignatzs’ version :wink: Nice and small and I understood it directly. Yours looks very interesting though, with some unknown things I’ll have to check. ‘coroutine.wrap’ and ‘.yield’. Thanks for giving me learning material.