List of combinations

After help with code

Need to list all combinations in groups of 3 where number cannot list more than once in the 3 number combo

Eg GOOD

1 - 2 - 3
1 - 2 - 4
1 - 2 - 5

Bad

1-1-1
1-1-2
1-1-3
1-2-1
etc
JasonAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Shaun KlineLead Software EngineerCommented:
That would normally be done using three loops:
For loop1 as integer = 1 to 10
   For loop2 as integer = loop1 + 1 to 10
      For loop3 as integer = loop 2 + 1 to 10
<your action here>
      Next
  Next
Next

Open in new window

0
JasonAuthor Commented:
Don't think that will work
Eg
2-1-3
Doesn't fit the formula
0
JasonAuthor Commented:
Eg combos for 1 to 3
123
132
213
231
321
312
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

Shaun KlineLead Software EngineerCommented:
Ok...Something like this?
For loop1 as integer = 1 to 10
   For loop2 as integer = 1 to 10
      If loop1 = loop2 Then Continue For
      For loop3 as integer = 1 to 10
          If loop1 = loop3 OrElse loop2 = loop3 Then Continue For
<your action here>
      Next
  Next
Next

Open in new window

0
Atdhe NuhiuCommented:
Dim comb As String = ""

For a1 As Integer = 1 To 9
      For a2 As Integer = 1 To 9
            For a3 As Integer = 1 To 9
                  If a1 <> a2 AndAlso a1 <> a3 AndAlso a2 <> a3 Then
                        comb = a1.ToString() & "-" & a2.ToString() & "-" & a3.ToString()
' save each value as you wish here
                  End If

            Next
      Next
Next
0
it_saigeDeveloperCommented:
Or you could use linq:
Module Module1
	Sub Main()
		Dim combinations = (From a As Integer In Enumerable.Range(1, 9) Let a1 As Integer = a _
		    From b As Integer In Enumerable.Range(1, 9) Let b1 As Integer = b _
		    From c As Integer In Enumerable.Range(1, 9) Let c1 As Integer = c _
		    Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
		    AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
		    AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
		    Select New Integer() {a1, b1, c1})
		For Each combination In combinations
			Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
		Next
		Console.ReadLine()
	End Sub
End Module

Open in new window


Produces the following sample output:Capture.JPG
-saige-
0
it_saigeDeveloperCommented:
Modifying for the test case 1 to 3:
Module Module1
	Sub Main()
		Dim combinations = (From a As Integer In Enumerable.Range(1, 3) Let a1 As Integer = a _
		    From b As Integer In Enumerable.Range(1, 3) Let b1 As Integer = b _
		    From c As Integer In Enumerable.Range(1, 3) Let c1 As Integer = c _
		    Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
		    AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
		    AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
		    Select New Integer() {a1, b1, c1})
		For Each combination In combinations
			Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
		Next
		Console.ReadLine()
	End Sub
End Module

Open in new window


Produces the following output:Capture.JPG
-saige-
0
it_saigeDeveloperCommented:
And for the coupe de gras, if you feel so inclined, you can create a method and add parameters so that you can provide your bookend integers, e.g. -
Module Module1
	Private Function GetCombinations(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer())
		Dim combinations = (From a As Integer In Enumerable.Range(start, [end]) Let a1 As Integer = a _
		  From b As Integer In Enumerable.Range(start, [end]) Let b1 As Integer = b _
		  From c As Integer In Enumerable.Range(start, [end]) Let c1 As Integer = c _
		  Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
		  AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
		  AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
		  Select New Integer() {a1, b1, c1})
		Return combinations
	End Function

	Sub Main()
		For Each combination In GetCombinations(1, 3)
			Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
		Next
		Console.ReadLine()
	End Sub
End Module

Open in new window


-saige-
0
Fernando SotoRetiredCommented:
Hi Renegade_AD;

Try this function out to see if it gives you what you are looking for.

public List<string> GeneratePermutations(string value)
{
    if (value.Length > 1)
    {
        return (from character in value
                from permutation in GeneratePermutations(value.Remove(value.IndexOf(character), 1))
                select string.Format("{0} - {1}", character, permutation)).ToList();
    }
    else
    {
        return new List<string>() { value };
    }
}

Open in new window


To call it you can do this,

List<string> results = GeneratePermutations("123");

or

List<string> results = GeneratePermutations(123.ToString());
0
it_saigeDeveloperCommented:
Here is Fernando's method in VB.NET:
Module Module1
	Private Function GetCombinations(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer())
		Dim combinations = (From a As Integer In Enumerable.Range(start, [end]) Let a1 As Integer = a _
		  From b As Integer In Enumerable.Range(start, [end]) Let b1 As Integer = b _
		  From c As Integer In Enumerable.Range(start, [end]) Let c1 As Integer = c _
		  Where Not a1.Equals(b1) AndAlso Not a1.Equals(c1) _
		  AndAlso Not b1.Equals(a1) AndAlso Not b1.Equals(c1) _
		  AndAlso Not c1.Equals(a1) AndAlso Not c1.Equals(b1) _
		  Select New Integer() {a1, b1, c1})
		Return combinations
	End Function

	Private Function GeneratePermutations(ByVal value As String) As List(Of String)
		If value.Length > 1 Then
			Return (From character In value _
			    From permutation In GeneratePermutations(value.Remove(value.IndexOf(character), 1)) _
			    Select String.Format("{0} - {1}", character, permutation)).ToList()
		Else
			Return New List(Of String) From {value}
		End If
	End Function

	Sub Main()
		Console.WriteLine("Using get combinations...")
		For Each combination In GetCombinations(1, 3)
			Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
		Next

		Console.WriteLine()
		Console.WriteLine("Using generate permutations...")
		For Each permutation In GeneratePermutations("123")
			Console.WriteLine(permutation)
		Next
		Console.ReadLine()
	End Sub
End Module

Open in new window


Produces the following output:Capture.JPG
BTW, nice use of recursion Fernando... ;)

-saige-
0
Fernando SotoRetiredCommented:
Hi Renegade_AD;

As -saige- pointed out that my solution was in C# I resubmit it in my version of VB .Net.

Public Function GeneratePermutations(ByVal value As String) As List(Of String)
    if value.Length > 1
        Return (From character in value
                from permutation in GeneratePermutations(value.Remove(value.IndexOf(character), 1))
                Select String.Format("{0} - {1}", character, permutation)).ToList()
    else
        Return New List(Of String)() From { value }
    End If
End Function

Open in new window


To call it you can do this,

Dim results As List(Of String) = GeneratePermutations("123");

or

Dim results As List(Of String) = GeneratePermutations(123.ToString());

@ -saige-, Thank you.
0
JasonAuthor Commented:
@it saige
your code works great.  one adjustment what about if i had a rage of numbers and i want them in combinations of 3
ie user enters
5
9  
7
1
3
8

output is all combination of these numbers in groups of 3
how you the code look for this
0
it_saigeDeveloperCommented:
Thats simple enough.  Now you are dealing with a distinct *list* of integers and a *list* is enumerable, so in this case we would not use the Enumerable.Range but rather the list of distinct numbers itself, e.g. -
Module Module1
	Private Function GetCombinations(ByVal numbers As IEnumerable(Of Integer)) As IEnumerable(Of Integer())
		Dim combinations = (From a As Integer In numbers _
		    From b As Integer In numbers _
		    From c As Integer In numbers _
		    Where Not a.Equals(b) AndAlso Not a.Equals(c) _
		    AndAlso Not b.Equals(a) AndAlso Not b.Equals(c) _
		    AndAlso Not c.Equals(a) AndAlso Not c.Equals(b) _
		    Select New Integer() {a, b, c})
		Return combinations
	End Function

	Sub Main()
		Dim numbers As Integer() = {5, 9, 7, 1, 3, 8}
		Console.WriteLine("Using distinct combinations...")
		For Each combination In GetCombinations(numbers)
			Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
		Next
		Console.ReadLine()
	End Sub
End Module

Open in new window


Produces the following output:Capture.JPG
Now we can simplify the original method by just calling the new GetCombinations method with the ranged enumerable:
Module Module1
	Private Function GetCombinations(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer())
		Return GetCombinations(Enumerable.Range(start, [end]))
	End Function

	Private Function GetCombinations(ByVal numbers As IEnumerable(Of Integer)) As IEnumerable(Of Integer())
		Dim combinations = (From a As Integer In numbers _
		    From b As Integer In numbers _
		    From c As Integer In numbers _
		    Where Not a.Equals(b) AndAlso Not a.Equals(c) _
		    AndAlso Not b.Equals(a) AndAlso Not b.Equals(c) _
		    AndAlso Not c.Equals(a) AndAlso Not c.Equals(b) _
		    Select New Integer() {a, b, c})
		Return combinations
	End Function

	Sub Main()
		Dim numbers As Integer() = {5, 9, 7, 1, 3, 8}
		Console.WriteLine("Using get combinations...")
		For Each combination In GetCombinations(1, 3)
			Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
		Next
		Console.WriteLine("Press any key to continue...")
		Console.ReadLine()

		Console.WriteLine()
		Console.WriteLine("Using distinct combinations...")
		For Each combination In GetCombinations(numbers)
			Console.WriteLine(String.Format("{0} - {1} - {2}", combination(0), combination(1), combination(2)))
		Next
		Console.ReadLine()
	End Sub
End Module

Open in new window


-saige-
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
JasonAuthor Commented:
Great help
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.