Quick actions

cmd+k|ctrl+k

Navigation

Languages

Permutations

Snippet info

Language

Lua

Visibility

public

Author

legacy-v1-16166

Created

2023-06-04T04:07:05.707499Z

Updated

2023-06-04T04:12:49.630079Z

function Factorial(Number)
    return (Number == 0 and 1) or (Number * Factorial(Number - 1))
end

function Permute(String)
    local Length = #String
    local TotalPermutes = Factorial(Length)
    
    local Permutations = {}
    
    for Index = 1, TotalPermutes do
        print(Index)
        
        table.insert(Permutations, String)
        
        local Index2 = Length - 1
        
        while String:sub(Index2, Index2) >= String:sub(Index2 + 1, Index2 + 1) do
            Index2 = Index2 - 1
        end
        
        local Length2 = Length
        
        while String:sub(Index2, Index2) >= String:sub(Length2, Length2) do
            Length2 = Length2 - 1
        end
        
        String = SwapCharacters(String, Index2, Length2)
        String = ReverseSubstring(String, Index2 + 1)
    end
    
    return Permutations
end

function SwapCharacters(String, Index, Index2)
    local Characters = {}
    
    for Character in String:gmatch(".") do
        table.insert(Characters, Character)
    end
    
    Characters[Index], Characters[Index2] = Characters[Index2], Characters[Index]
    
    return table.concat(Characters)
end


function ReverseSubstring(String, Start)
    local Characters = {}
    
    for Character in String:gmatch(".") do
        table.insert(Characters, Character)
    end
    
    local Index = Start
    local Index2 = #Characters
    
    while Index < Index2 do
        Characters[Index], Characters[Index2] = Characters[Index2], Characters[Index]
        
        Index = Index + 1
        Index2 = Index2 - 1
    end
    
    return table.concat(Characters)
end

local String = ""
local Permutations = Permute("wow")

for _, Permute in next, Permutations do
    print(Permute)
end
INFO