Private Function GetPermutation(ByVal ParamArray elements() As String) As List(Of String)
Dim init As String = elements(0)
Dim curEleIndex As Integer = 0
Dim lstRet As New List(Of String)
Dim curNumElements As Integer = 1
lstRet.Add(init)
Do
curEleIndex += 1
curNumElements += 1
DuplicateList(lstRet, curNumElements)
'Weave Index is zero-based
Dim curWeaveIndex = CountElements(lstRet.Item(0))
'The number being weaved is moving left
Dim bMoveLeft As Boolean = True
For i = 0 To lstRet.Count - 1
Dim ss As String = lstRet.Item(i)
lstRet(i) = WeaveInto(ss, elements(curEleIndex), curWeaveIndex)
If bMoveLeft Then
curWeaveIndex -= 1
Else
curWeaveIndex += 1
End If
If bMoveLeft And curWeaveIndex = 0 Then
bMoveLeft = False
i += 1
lstRet(i) = WeaveInto(ss, elements(curEleIndex), curWeaveIndex)
End If
If bMoveLeft = False And curWeaveIndex = curNumElements - 1 Then
i += 1
lstRet(i) = WeaveInto(ss, elements(curEleIndex), curWeaveIndex)
bMoveLeft = True
End If
Next
Loop Until curEleIndex >= UBound(elements)
Return lstRet
End Function
Private Function GetPermutation(ByVal Lo As Integer, ByVal Hi As Integer) As List(Of String)
Dim init As String = CStr(Lo)
Dim curNum As Integer = Lo
Dim lstRet As New List(Of String)
Dim curNumElements As Integer = 1
lstRet.Add(init)
Do
curNum += 1
curNumElements += 1
DuplicateList(lstRet, curNumElements)
'Weave Index is zero-based
Dim curWeaveIndex = CountElements(lstRet.Item(0))
'The number being weaved is moving left
Dim bMoveLeft As Boolean = True
For i = 0 To lstRet.Count - 1
Dim ss As String = lstRet.Item(i)
lstRet(i) = WeaveInto(ss, CStr(curNum), curWeaveIndex)
If bMoveLeft Then
curWeaveIndex -= 1
Else
curWeaveIndex += 1
End If
If bMoveLeft And curWeaveIndex = 0 Then
bMoveLeft = False
i += 1
lstRet(i) = WeaveInto(ss, CStr(curNum), curWeaveIndex)
End If
If bMoveLeft = False And curWeaveIndex = curNumElements - 1 Then
i += 1
lstRet(i) = WeaveInto(ss, CStr(curNum), curWeaveIndex)
bMoveLeft = True
End If
Next
Loop Until curNum >= Hi
Return lstRet
End Function
Public Sub DuplicateList(ByRef list As List(Of String), ByVal numDups As Integer)
Dim ll As New List(Of String)
For Each S As String In list
For i = 1 To numDups
ll.Add(S)
Next
Next
list = ll
End Sub
Public Function CountElements(ByVal numbers As String) As Integer
Return numbers.Split(",").Count
End Function
Public Function WeaveInto(ByVal elements As String, ByVal newElement As String, ByVal index As Integer) As String
Dim nums As List(Of String) = elements.Split(",").ToList
nums.Insert(index, newElement)
Return String.Join(",", nums.ToArray)
End Function