
Download: char Combinations.zip
When answering a forum question on how to calculate the shortest path from form left to right, intersecting 4 ellipses, where I had to find every possible order for the 4 ellipses before measuring the distances for each unique path, I developed some code to find every possible order. It hadn't occurred to me before tha
char Combinations
After my previous submission (Maths Revision V1.0) in the TechNet competition last month, here's a preview of what V2.0 will contain:

Downlt the number of unique paths is equal to the factorial of the number of ellipses (4! = 24). This is the code I developed for finding every possible combination of a user defined set of characters:

Downlt the number of unique paths is equal to the factorial of the number of ellipses (4! = 24). This is the code I developed for finding every possible combination of a user defined set of characters:
Imports
System.Numerics
Public
Class
Form1
Private
Sub
Form1_Load(ByVal
sender As
System.Object,
ByVal
e As
System.EventArgs) Handles
MyBase.Load
Me.AcceptButton = Button1
End
Sub
'this draws a grid over the whole form
Private
Sub
Form1_Paint(ByVal
sender As
Object, ByVal
e As
System.Windows.Forms.PaintEventArgs) Handles
Me.Paint
For
c As
Integer
= 0 To
Me.Width Step
25
e.Graphics.DrawLine(Pens.LightGray, c, 0, c,
Me.Height)
Next
For
r As
Integer
= 0 To
Me.Height Step
25
e.Graphics.DrawLine(Pens.LightGray, 0, r,
Me.Width, r)
Next
End
Sub
Private
Function
listCombinations(ByVal
n As
Integer,
ByVal
a() As
Objund-color:#ffffff;"> End
) As
List(Of String)
Dim
output As
New
List(Of String)
Dim
max As
BigInteger = Factorial(n)
Dim
counter As
New
BigInteger(0)
Dim
ordinals(n - 1) As
Integer
ordinals.SetValue(-1, ordinals.GetUpperBound(0))
Do
While
counter < max
incrementOrdinals(n - 1, ordinals)
If
ordinals.Distinct.Count <> ordinals.Count Then
Continue Do
counter += 1
output.Add(String.Concat(ordinals.Select(Function(x)
a(x))))
Loop
Return
output
End
Function
Private
Function
Factorial(n As
Integer) As
BigInteger
Dim
f As
New
BigInteger(n)
For
x As
Integer
= n - 1 To
1 Step
-1
f = f * x
Next
Return
f
End
Function
Private
Sub
incrementOrdinals(max As
Integer,
ByRef
o() As
Integer)
For
x As
Integer
= max To
0 Step
-1
If
o(x) < max Then
o(x) += 1
Exit
For
Else
o(x) or:#006699;font-weight:bold;">Then
o(x) += 1
End
If
Next
End
Sub
Private
Sub
Button1_Click(sender As
Object, e
As
EventArgs) Handles
Button1.Click
If
TextBox1.Text.Length = 1 Then
If
Char.IsLetterOrDigit(TextBox1.Text, 0)
Then
ListBox2.Items.Add(TextBox1.Text)
TextBox1.Clear()
ListBox1.Items.Clear()
ListBox1.Items.AddRange(listCombinations(ListBox2.Items.Count, ListBox2.Items.Cast(Of
String).ToArray).ToArray)
Label1.Text =
String.Format("Combinations: {0}", ListBox1.Items.Count)
End
If
End
If
End
Sub
Private
Sub
ListBox2_MouseDoubleClick(sender As
Object, e
As
MouseEventArgs) Handles
ListBox2.MouseDoubleClick
Dim
clickedIndex As
Integer
= ListBox2.IndexFromPoint(e.Location)
If
clickedIndex > -1 Then
ListBox2.Items.RemoveAt(clickedIndex)
ListBox1.Items.Clear()
If
ListBox2.Items.Count > 0 ThenIf
clickedIndex > -1 Then
ListBox1.Items.AddRange(listCombinations(ListBox2.Items.Count, ListBox2.Items.Cast(Of
String).ToArray).ToArray)
End
If
Label1.Text =
String.Format("Combinations: {0}", ListBox1.Items.Count)
End
If
End
Sub
End
Class