Esto no acaba nunca :(
Esto ya funciona pero me repite las combinaciones y necesito números o combinaciones únicas ya que 1, 2, 3 es lo mismo que 3, 2, 1 o 2, 1, 3... solo debe quedar uno de ellos
he probado con poner " .Distinct().ToArray " pero como siempre :(
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim intCol As IEnumerable(Of Integer) = {20, 24, 34, 37}
Dim pairsCol As IEnumerable(Of String) =
From value1 As Integer In intCol
From value2 As Integer In intCol
Select String.Join(Environment.NewLine, (
From value3 As Integer In intCol
Where (value1 <> value2) AndAlso
(value1 <> value3) AndAlso
(value2 <> value3)
Select String.Format("{0:00}, {1:00}, {2:00}",
value1, value2, value3)))
For Each pairs As String In pairsCol
For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray
' MsgBox(pairs.Count)
' MsgBox(line.Count)
Me.ListBox1.Items.Add(line)
Next line
Next pairs
End Sub
salida
20, 24, 34***
20, 24, 37
20, 34, 24***
20, 34, 37
20, 37, 24
20, 37, 34****
24, 20, 34
24, 20, 37
24, 34, 20
24, 34, 37
24, 37, 20
24, 37, 34
34, 20, 24
34, 20, 37
34, 24, 20***
34, 24, 37
34, 37, 20
34, 37, 24
37, 20, 24****
37, 20, 34
37, 24, 20
37, 24, 34
37, 34, 20
37, 34, 24
si os dais cuenta las combinaciones se repiten pero con el orden de los numeros cambiados como podria dejar solo una de ellas ???
Luis
20, 24, 34
20, 34, 24
34, 24, 20
Yo no veo ninguna repetición, tecnicamente son combinaciones distintas.
Muestra la lista completa del resultado que obtienes, y la lista completa del resultado que esperas obtener, sino esto no hay quien lo entienda ya!.
Bueno aca esta la lista completa como me lo entrega ahora .esto esta haciedo permutaciones pero no quiero modificar el codigo ya que le tengo otras ideas jejej
solamente quiero dejar una combinacion de cada uno.esto es quitar toda cambinaciones que tengan o coincidan los mismos tres numeros en diferente orden.
ideas pasar esta lista a una variable donde elimine antes de mostrar en el listbox .
ahora esta es la salida como me la muestra.
20, 24, 34
20, 24, 37
20, 34, 24
20, 34, 37
20, 37, 24
20, 37, 34
24, 20, 34
24, 20, 37
24, 34, 20
24, 34, 37
24, 37, 20
24, 37, 34
34, 20, 24
34, 20, 37
34, 24, 20
34, 24, 37
34, 37, 20
34, 37, 24
37, 20, 24
37, 20, 34
37, 24, 20
37, 24, 34
37, 34, 20
37, 34, 24
quiero ir eliminando las combinaciones iguales porque si se mira bien. veras que hay combinaciones que son iguales. solo que cambian las posiciones de los números.
debería quedar asi
20, 24, 34
20, 24, 37
20, 34, 37
24, 34, 37
Luis
De todas formas, tengo una sorpresita para ti.
Ayer te mencioné lo del desarrollo de la función de permutaciones (ya no se si quieres combinaciones o permutaciones, pero esto viene al caso igualmente),
al final he acabado haciendo un puerto para Vb.Net de la librería Combinatronics, la cual tiene un código fuente que es una delicia:
- https://github.com/eoincampbell/combinatorics
Aun no he terminado de finalizar el código fuente, pero igualmente puedes usar ese en C#. Solo tienes que descargarlo desde GitHub y compilarlo en Visual Studio, se generará una librería "Combinatronics.dll", referencias esa dll en tu proyecto de Vb.Net, y listo.
Modo de empleo:
Dim permutations As New Permutations(Of Integer)({3, 1, 10}, MetaCollectionType.WithoutRepetition)
MsgBox(String.Format("Permutaciones: {0}", permutations.Count))
For Each permutation As List(Of Integer) In permutations
Console.WriteLine(String.Join(", ", permutation))
Next permutation
PD: Si esto no resuelve los problemas con combinaciones/permutaciones ...yo no se que más puedes necesitar ya xD.
Saludos!
Cita de: Eleкtro en 23 Marzo 2016, 15:05 PM
De todas formas, tengo una sorpresita para ti.
Ayer te mencioné lo del desarrollo de la función de permutaciones (ya no se si quieres combinaciones o permutaciones, pero esto viene al caso igualmente),
al final he acabado haciendo un puerto para Vb.Net de la librería Combinatronics, la cual tiene un código fuente que es una delicia:
- https://github.com/eoincampbell/combinatorics
Aun no he terminado de finalizar el código fuente, pero igualmente puedes usar ese en C#. Solo tienes que descargarlo desde GitHub y compilarlo en Visual Studio, se generará una librería "Combinatronics.dll", referencias esa dll en tu proyecto de Vb.Net, y listo.
Modo de empleo:
Dim permutations As New Permutations(Of Integer)({3, 1, 10}, MetaCollectionType.WithoutRepetition)
MsgBox(String.Format("Permutaciones: {0}", permutations.Count))
For Each permutation As List(Of Integer) In permutations
Console.WriteLine(String.Join(", ", permutation))
Next permutation
PD: Si esto no resuelve los problemas con combinaciones/permutaciones ...yo no se que más puedes necesitar ya xD.
Saludos!
Gracias por tu tiempo y GRAN PACIENCIA jejejje lo que necesito es crear un sistema de Combinaciones pero no busco lo normal jejejje busco algo diferente pero en combinaciones únicas ya que codigos de combinaciones hay miles pero son lo basico y normal jejje con eso no se llega a donde quiero ir ::) , las permutas no me valen para lo que busco :( te puse lo que me gustaría poder hacer a ver si se puede, sin modificar la funcion del codigo ,solo en el resultado
Luis
Ya me canse jejej ,,de revizar todos mis códigos y parte de google todo el dia :(
alguna idea ? que me pueda servir
puedes detallar un poco mas lo que quieres hacer?
Cita de: crack81 en 23 Marzo 2016, 23:40 PM
puedes detallar un poco mas lo que quieres hacer?
Bueno analizando el problema , lo que quiero es ordenar los registros y eliminar los coincidentes
ahora me los entrega de esta forma desordenado deberian estar por oden de menor a mayor
20, 24, 34
20, 24, 37
20, 34, 24
20, 34, 37
para poder eliminar iguales se debería de ordenar primero el orden de los registros
20, 24, 34
20, 24, 37
20, 24, 34*********
20, 34, 37*********
Para eliminar los que están marcados con *
For Each pairs As String In pairsCol
For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray
' MsgBox(pairs.Count)
' MsgBox(line.Count)
Me.ListBox1.Items.Add(line)
Next line
Next pairs
Estoy tratado de convertir la variable antes de llenar el testbox
Pero cuando trato de hacerlo con (Line) me dice error
"Ya no se admiten instrucciones 'Line'." ????
estoy mas enredado :silbar:
Luis
Hola Luis
Ya te comenté lo de meter la lista en un Array list:
Dim Elementos() As String = {1, 2, 3, 3, 3, 4, 4, 5}
Dim LISTA As New List(Of String)(Elementos)
MsgBox("Con repeticiones")
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
MsgBox("Sin repeticiones")
ListBox1.Items.Clear()
LISTA = LISTA.Distinct.ToList '<---Elimina las repeticones de la lista
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
Con integer:
Dim Elementos() As Integer = {1, 2, 3, 3, 3, 4, 4, 5}
Dim LISTA As New List(Of Integer)(Elementos)
MsgBox("Con repeticiones")
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
MsgBox("Sin repeticiones")
ListBox1.Items.Clear()
LISTA = LISTA.Distinct.ToList '<---Elimina las repeticones de la lista
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
Cita de: Lekim en 24 Marzo 2016, 13:56 PM
Hola Luis
Ya te comenté lo de meter la lista en un Array list:
Dim Elementos() As String = {1, 2, 3, 3, 3, 4, 4, 5}
Dim LISTA As New List(Of String)(Elementos)
MsgBox("Con repeticiones")
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
MsgBox("Sin repeticiones")
ListBox1.Items.Clear()
LISTA = LISTA.Distinct.ToList '<---Elimina las repeticones de la lista
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
Con integer:
Dim Elementos() As Integer = {1, 2, 3, 3, 3, 4, 4, 5}
Dim LISTA As New List(Of Integer)(Elementos)
MsgBox("Con repeticiones")
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
MsgBox("Sin repeticiones")
ListBox1.Items.Clear()
LISTA = LISTA.Distinct.ToList '<---Elimina las repeticones de la lista
For Each N As String In LISTA
ListBox1.Items.Add(N)
Next
Hola y gracias ,bueno esto solo funciona con la cadena propia que me muestras
Dim Elementos() As String = {1, 2, 3, 3, 3, 4, 4, 5}
Dim LISTA As New List(Of String)(Elementos)
y yo busco es aplicarlo a los resultados que me da :
For Each pairs As String In pairsCol
For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray
' MsgBox(pairs.Count)
' MsgBox(line.Count)
Me.ListBox1.Items.Add(line)
Next line
Next pairs
Donde se supone que los datos dentro del listbox es LINE el cual no encuentro la manera de pasarlos a un array y ya he probado de todo ;(
Luis
Chacho, por correo privado ya te contesté. ¿Dónde ves tú que aquí se repitan?
Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 6}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
01, 03, 04
01, 03, 05
01, 03, 06
01, 04, 05
01, 04, 06
01, 05, 06
03, 04, 05
03, 04, 06
03, 05, 06
04, 05, 06
Cita de: Lekim en 24 Marzo 2016, 13:17 PM
Bueno, y está..el de 3
Lo que tengo una duda respecto a como quieres combinarlos, ya que hay muchas posibilidades. Te aconsejo, cuando preguntes aquí en el foro que especifiques bien las condiciones, más que nada para ahorrarte tener que volver a preguntar y trabajo y tiempo perdido para los demás.
POSIBILIDADES DE COMBINAR DE TRES EN TRES:
Combinarlos de modos que el segundo y el tercero de puedan repetir
1,2,2
1,2,3
1,2,4
Igual y que tercero pueda ser MENOR que el segundo.
...
1, 3, 2
1, 3, 3
1, 3, 4
Que el segundo y que el tercero no puedan ser iguales
...
1, 3, 2
1, 3, 4
1, 3, 5
Que el segundo y el tercero no puedan ser iguales y el tercero no pueda ser menor que el segundo
1, 2 ,3
1, 2, 4
1, 3, 4
1, 3, 5
2, 3, 4
CÓDIGO:
OPCIÓN 1: Permite el tercero menor que el segundo y que tercero y segundo sena iguales
Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX - 1 To Elementos.Count - 1
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
OPCIÓN 2: No permite segundo y tercero sean iguales pero si que el tercero sea menor que el segundo.
Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX - 1 To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
OPCIÓN 3: No permite que el segundo y el tercero sean iguales, ni tampoco que el tercero sea menor que el segundo.
Dim Elementos As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
Creo que no hay errores :silbar:
Si eso me lo cuentas
S2s
Se llaman Combinaciones SIN REPETICIÓN y en combinatoria se puede simbolizar así:
C m,n
y la fórmula para determinar el número de combinaciones:
m!
C m,n = ___________
n! · ( m-n)!donde
m! es el factorial del número total de elementos
y
n un número de elementos de cada grupo
Consiste por ejemplo en realizar con un determinado grupo de elementos E={A,B,C,D,E} grupos de 3 en 3 y sin repetición. Si hay ABC, no vale BCA, ni tampoco AAA o ABB.
Si m=[A,B,C,D,E] = 5 elementos
n= grupos de 3 en 3
5!
C 5,3 = ___________ = 10 combinaciones
3! · ( 5-3)!ABC
ABD
ABE
ACE
.....
Dim Elementos As IEnumerable(Of Integer) = {1, 2, 3, 4, 5}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
Como ves salen 10
En la primitiva te saldrían ni más ni menos que......
49!/(6!·(49 - 6)!)=
13.983.816Ya que en la primitiva da igual 14, 5 ,25 que 5, 14 ,25. Las bolas salen en un orden pero luego se ordenan, y no pueden volver a salir repetidas porque todas están en el mismo bombo.
Como ya te dije son casi 14 millones de combinaciones... :xD
Jjejeje no se cuando aprendí hablar chino ;D ;D ;D 我不明白的貓
A ver lekim estoy usando este código, los tuyos los tengo reservados a otros proyecto que se me ocurren por cierto me parecen estupendos ,pero estoy usando el código de Elektro este código me entrega los números a si. y
supongamos que voy a jugar a la lotería :silbar: .como dices son no se cuantos millones de apuestas pero te equivocas en la primitiva ahora son mas millones ya ahora es 6+complementario eso te multiplica la ostia :o
Para que necesito hacer apuestas donde los números se repiten ? estaríamos formando realmente apuestas iguales si ordenamos los números de cada linea de menor a mayor.veremos que se repiten muchos registros por ende. es lo que quiero eliminar todos los que tienen asterisco ya que son combinaciones iguales pero en diferente orden
asi es como me entrega AHORA este codigo los resultados
20, 24, 34***
20, 24, 37
20, 34, 24***
20, 34, 37
20, 37, 24
20, 37, 34****
24, 20, 34
24, 20, 37
24, 34, 20
24, 34, 37
24, 37, 20
24, 37, 34
34, 20, 24
34, 20, 37
34, 24, 20***
34, 24, 37
34, 37, 20
34, 37, 24
37, 20, 24****
37, 20, 34
37, 24, 20
37, 24, 34
37, 34, 20
37, 34, 24
Simplemente quiero dejar números, registros o lineas únicas
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim intCol As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
Dim pairsCol As IEnumerable(Of String) =
From value1 As Integer In intCol
From value2 As Integer In intCol
Select String.Join(Environment.NewLine, (
From value3 As Integer In intCol
Where (value1 <> value2) AndAlso
(value1 <> value3) AndAlso
(value2 <> value3)
Select String.Format("{0:00}, {1:00}, {2:00}",
value1, value2, value3)))
For Each pairs As String In pairsCol
For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
' MsgBox(pairs.Count)
' MsgBox(line1.Count)
Me.ListBox1.Items.Add(line)
Next line
Next pairs
Luis
Bueno esto es como la once que le han puesto lo de los números de serie, pero en lo básico es 100000 números, luego tienes + el número de serie y todas las jodidos 'TIMOJUEGOS' que se les ocurra.
Realmente no me queda lo claro lo que quieres, :-\. Pero mientras escribías hice este código a ver si te sirve.
Crea los seis números de la Primitiva, sin repetir y en orden de numeración con la función GetCombPrimitiva . Además crea tantas combinaciones como quieras hacer y SIN REPETIR, establecido en NumCombinaciones
Si hay algún fallo pues que alguien lo digo o lo arregle jaja
GENERADOR DE COMBINACIONES DEL LA PRIMITIVA
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ListaComb As New List(Of String) '//Lista de combinaciones
Dim NumCombinaciones As Integer = 5
Dim NewComb As String
ListaComb.Clear()
For B1 As Integer = 1 To NumCombinaciones
While ListaComb.Count < NumCombinaciones
NewComb = GetCombPrimitiva()
ListaComb.Add(NewComb)
ListaComb = ListaComb.Distinct.ToList
My.Application.DoEvents()
End While
Next B1
ListBox1.Items.Clear()
For Each Elem As String In ListaComb
ListBox1.Items.Add(Elem)
Next
End Sub
Public Function GetCombPrimitiva() As String
Dim Bombo As New List(Of Integer) '//Bombo para meter las bolas
Dim Fila As New List(Of Integer) '//Fila virtual para poner las bolas en orden
Dim Combinación As String = Nothing
Dim NumRandom As New Random
'//Llena el bombo
For Bolas As Integer = 1 To 49
Bombo.Add(Bolas)
Next
'//Extrae las bolas
For Index As Integer = 1 To 6
'//Devuelve números del 0 a 48 (49 números, Bola(0): contiene 1, Bola(1): Bolcontiene 2 ...)
Dim Bola As Integer = NumRandom.Next(0, Bombo.Count)
'//Mete la bola en la "fila"
Fila.Add(Bombo(Bola))
'//Quita la bola obtenida del bombo
Bombo.RemoveAt(Bola)
Next
Fila.Sort() 'Ordena la fila de bolas
For Each Bola As Integer In Fila
Combinación += String.Format("{0:00} ", Bola)
Next
Return Combinación
End Function
End Class
Por cierto que si Elektro no te lo ha resuelto ya es que no se puede :xD
Además que lo que pides ya lo he puesto yo, creo , pero tu te has empeñado en usar este código:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim intCol As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
Dim pairsCol As IEnumerable(Of String) =
From value1 As Integer In intCol
From value2 As Integer In intCol
Select String.Join(Environment.NewLine, (
From value3 As Integer In intCol
Where (value1 <> value2) AndAlso
(value1 <> value3) AndAlso
(value2 <> value3)
Select String.Format("{0:00}, {1:00}, {2:00}",
value1, value2, value3)))
For Each pairs As String In pairsCol
For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
' MsgBox(pairs.Count)
' MsgBox(line1.Count)
Me.ListBox1.Items.Add(line)
Next line
Next pairs
y quieres quitar repeticiones... este código ya está hecho para crear las combinaciones así, tendrías que cambiar las condiciones o añadir más código para ir leyendo línea tras línea y comprando para ir eliminado, un rollo :-X
Sinceramente, no se como hacerlo usando ese código :¬¬. Yo ta te lo hice. Parece que hablo chino yo jaja. Hasta he dado clases de combinatoria que más quieres XD
Joder estas empeñado con lo imposible jejej
Sinceramente, no se como hacerlo usando ese código :¬¬. Yo ta te lo hice. Parece que hablo chino yo jaja. Hasta he dado clases de combinatoria que más quieres XD
Si lo que nesecito no es modificar el codigo. es eliminar en el listbox los numeros o lineas repetidas ........como ufff se me seca la lengua jajajja no me interesa modificar el codigo
voy corriendo a probar este codigo de la primi a ver si tengo mas suerte que aca JAJAJJA
gracias :) por tu paciencia
Luis
Cita de: luis456 en 25 Marzo 2016, 18:26 PM
Si lo que nesecito no es modificar el codigo. es eliminar en el listbox los numeros o lineas repetidas ........como ufff se me seca la lengua jajajja no me interesa modificar el codigo
gracias :) por tu paciencia
Luis
ahí está compi, para hacer eso cambias el código o usas el que ya te di uno usando For Next o añades más còdigo para quitar las repeticones lo cual es un royo. Por eso te digo que si yo ya he puesto un código que hace esto mismo porque te empeñas en usar este XD
Cita de: Lekim en 25 Marzo 2016, 18:29 PM
ahí está compi, para hacer eso cambias el código o usas el que ya te di uno usando For Next o añades más còdigo para quitar las repeticones lo cual es un royo. Por eso te digo que si yo ya he puesto un código que hace esto mismo porque te empeñas en usar este XD
Ya puse tu codigo de la primitiva a rular a ver si ganamos jejejje ;-) ,bueno en serio ,olvidate del codigo, solo imagina que tenemos el listbox y hay que eliminar como comento tan dificil es ???
Luis
Amos a ver
¿Y esto que es lo que hace?
Dim Elementos As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 44
20, 34, 45
20, 44, 45
24, 34, 44
24, 34, 45
24, 44, 45
34, 44, 45
madre miaaaa!!!!!
El de la primitiva tenía un fallo, no salía el 49, ya lo he arreglado :-[
El de la primitiva modificando un poco también hace LO MISMO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ListaComb As New List(Of String) '//Lista de combinaciones
Dim NumCombinaciones As Integer = 10 '<---OJO EN ESTE CASO SOLO LO MAXÍMO SON 10
Dim NewComb As String
ListaComb.Clear()
For B1 As Integer = 1 To NumCombinaciones
While ListaComb.Count < NumCombinaciones
NewComb = GetCombPrimitiva()
ListaComb.Add(NewComb)
ListaComb = ListaComb.Distinct.ToList
My.Application.DoEvents()
End While
Next B1
ListaComb.Sort()
ListBox1.Items.Clear()
For Each Elem As String In ListaComb
ListBox1.Items.Add(Elem)
Next
End Sub
Public Function GetCombPrimitiva() As String
Dim MisBolas() As String = {20, 24, 34, 44, 45}
Dim Bombo As New List(Of Integer) '//Bombo para meter las bolas
Dim Fila As New List(Of Integer) '//Fila virtual para poner las bolas en orden
Dim Combinación As String = Nothing
Dim NumRandom As New Random
'//Llena el bombo
For Index As Integer = 0 To MisBolas.Count - 1
Bombo.Add(MisBolas(Index))
Next
'//Extrae las bolas
For Index As Integer = 1 To 3
'//Devuelve números del 0 a 48 (49 números, Bola(0): contiene 1, Bola(1): Bolcontiene 2 ...)
Dim Bola As Integer = NumRandom.Next(0, Bombo.Count)
'//Mete la bola en la "fila"
Fila.Add(Bombo(Bola))
'//Quita la bola obtenida del bombo
Bombo.RemoveAt(Bola)
Next
Fila.Sort() 'Ordena la fila de bolas
For Each Bola As Integer In Fila
Combinación += String.Format("{0:00} ", Bola)
Next
Return Combinación
End Function
End Class
Pero OJO con el valor que pones a NumCombinaciones , pues lo máximo que debes poner es el máximo que permite las condiciones que en este caso son :
C5,3= 5!/(3!·(5-3)!) = 10 combinaciones
Cita de: Lekim en 25 Marzo 2016, 19:01 PM
Amos a ver
¿Y esto que es lo que hace?
Dim Elementos As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 44
20, 34, 45
20, 44, 45
24, 34, 44
24, 34, 45
24, 44, 45
34, 44, 45
madre miaaaa!!!!!
A ver jejej en que parte empiezo hablar chino jajja no en serio ,se que te pica la curiosidad :silbar: para ordenarlos lo puedo hacer a mano ademas tengo que mirar si este codigo hace exactamente que lo de elektro y por favor no te ofendas jejje no es que sea mejor o peor, es que tengo metida entre ceja y ceja una idea y yo soy muy "TERCO · lo Reconozco .solo quiero trabajar con el listbox despues que este cargado con el otro codigo, pero ahora mismo voy a compararlos ya te dire que hace jejejje solo mira bien y tienes que darte cuenta que es lo que hace y ya te lo dire pero con pruebas :)
Luis
joer
El código de elektro te hace esto;
20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 24
20, 34, 44
20, 34, 45
20, 44, 24
20, 44, 34
20, 44, 45
20, 45, 24
20, 45, 34
20, 45, 44
24, 20, 34
24, 20, 44
24, 20, 45
24, 34, 20
24, 34, 44
24, 34, 45
24, 44, 20
24, 44, 34
24, 44, 45
24, 45, 20
24, 45, 34
24, 45, 44
34, 20, 24
34, 20, 44
34, 20, 45
34, 24, 20
34, 24, 44
34, 24, 45
34, 44, 20
34, 44, 24
34, 44, 45
34, 45, 20
34, 45, 24
34, 45, 44
44, 20, 24
44, 20, 34
44, 20, 45
44, 24, 20
44, 24, 34
44, 24, 45
44, 34, 20
44, 34, 24
44, 34, 45
44, 45, 20
44, 45, 24
44, 45, 34
45, 20, 24
45, 20, 34
45, 20, 44
45, 24, 20
45, 24, 34
45, 24, 44
45, 34, 20
45, 34, 24
45, 34, 44
45, 44, 20
45, 44, 24
45, 44, 34
y tu quieres quitar repeticiones de modo que si pone ABC , ni otro ABC, ni ponga BCA o BAC, esto REPIIIIITOOOOOO son COMBINACIONES SIN REPETICION y al final te queda esto:
20, 24, 34
20, 24, 44
20, 24, 45
20, 34, 44
20, 34, 45
20, 44, 45
24, 34, 44
24, 34, 45
24, 44, 45
34, 44, 45
Que es lo que hace mi código ¿Cual es el problema? Quien entienda que te compre ajajja.
Hola cara de japones jejej es broma yo me tomo todo en broma ya con mi edad no se puede andar enfadado, mira como lo llevo ponlo a rular y dime que tal va :)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Elementos As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 50}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim list As New List(Of String)
Dim i As Integer
For i = 0 To ListBox1.Items.Count - 1
list.Add(ListBox1.Items(i))
Next i
ListBox1.Items.Clear()
For Each s As String In list.Distinct
ListBox1.Items.Add(s)
Next
End Sub
y si resta o no resta después de aplicar el filtro habra que poner un count despues de aplicar el filtro
espero
Luis
Chacho has repetido números:
{2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 50}
Quita ese número repetido (41)y verás que te salen 969 XD
Dim Elementos As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
19!
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ = 969
3!·(19 - 3)!
Cita de: Lekim en 25 Marzo 2016, 20:04 PM
Chacho has repetido números:
{2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 50}
Quita ese número repetido (41)y verás que te salen 969 XD
Dim Elementos As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50}
Dim EleX As Integer = 0
Dim EleX2 As Integer = 0
ListBox1.Items.Clear() 'Limpia el ListBox
For I1 As Integer = 0 To Elementos.Count - 1 : EleX += 1
For I2 As Integer = EleX To Elementos.Count - 1
For I3 As Integer = EleX To Elementos.Count - 1
If Elementos(I2) <> Elementos(I3) And Elementos(I3) > Elementos(I2) Then
ListBox1.Items.Add(String.Format("{0:00}, {1:00}, {2:00}", Elementos(I1), Elementos(I2), Elementos(I3)))
End If
Next
Next
Next
MessageBox.Show("Combinaciones: " & ListBox1.Items.Count)
19!
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ = 969
3!·(19 - 3)!
Ya sabes las prisas jejjejeje pero si resta no ? y deja solo únicos, ya no veo de tanto estar pegado al monitor :(
luis
Creo que lo tengo como querias.... jeje
espero te sirva "Al estilo Elektro" ajaja que lujo :xD:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim intCol As IEnumerable(Of Integer) = {20, 24, 34, 44, 45}
Dim pairsCol As IEnumerable(Of String) =
From value1 As Integer In intCol
From value2 As Integer In intCol
Select String.Join(Environment.NewLine, (
From value3 As Integer In intCol
Where (value1 <> value2) AndAlso
(value1 <> value3) AndAlso
(value2 <> value3) AndAlso
(value3 > value2) AndAlso
(value2 > value1)
Select String.Format("{0:00}, {1:00}, {2:00}",
value1, value2, value3)))
Dim ClearRep As New List(Of String)
For Each pairs As String In pairsCol
For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
ListBox1.Items.Add(line)
Next line
Next pairs
MessageBox.Show(ListBox1.Items.Count)
End Sub
End Class
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim intCol As IEnumerable(Of Integer) = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50}
Dim pairsCol As IEnumerable(Of String) =
From value1 As Integer In intCol
From value2 As Integer In intCol
Select String.Join(Environment.NewLine, (
From value3 As Integer In intCol
Where (value1 <> value2) AndAlso
(value1 <> value3) AndAlso
(value2 <> value3) AndAlso
(value3 > value2) AndAlso
(value2 > value1)
Select String.Format("{0:00}, {1:00}, {2:00}",
value1, value2, value3)))
Dim ClearRep As New List(Of String)
For Each pairs As String In pairsCol
For Each line As String In pairs.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
ListBox1.Items.Add(line)
Next line
Next pairs
MessageBox.Show(ListBox1.Items.Count)
End Sub
End Class
Hace lo mismo que el mio, pero como insistias tanto en este sistema lo he machacado un poco hasta que di con el problemas, pero vamos que hace lo mismo.
El mal llamado "Estilo Elektro" se denomina LINQ-to-Objects, es algo más expensivo que un FOR, pero más legible y manejable que un FOR.
Si le ofrezco soluciones basadas en LINQ, es por que supuestamente Luis en su día se puso a practicar con los 101 ejemplos de LINQ oficiales de la galería de código de Microsoft, por lo que está más acostumbrado a este estilo de sintaxis, lo cual, en mi opinión, le resultará de mucha utilidad, puesto que, lo bueno de LINQ, es su versatilidad con esa cantidad de útiles keywords disponibles para realizar típicas operaciones que nos tomarían más tiempo de escritura al traducirlas a un búcle For Range o For Each.
Saludos.
Cita de: Eleкtro en 25 Marzo 2016, 21:11 PM
El mal llamado "Estilo Elektro" se denomina LINQ-to-Objects, es algo más expensivo que un FOR, pero más legible y manejable que un FOR.
Si le ofrezco soluciones basadas en LINQ, es por que supuestamente Luis en su día se puso a practicar con los 101 ejemplos de LINQ oficiales de la galería de código de Microsoft, por lo que está más acostumbrado a este estilo de sintaxis, lo cual, en mi opinión, le resultará de mucha utilidad, puesto que, lo bueno de LINQ, es su versatilidad con esa cantidad de útiles keywords disponibles para realizar típicas operaciones que nos tomarían más tiempo de escritura al traducirlas a un búcle For Range o For Each.
Saludos.
Hola Elektro
No te lo tomes a ma, jeje. Desconocía completamente que se pudiera hacer usando LINQ-to-Objects, es mas desconocía LINQ-to-Objects. Con eso te lo digo todo.
Pero... este sistema va como sobre raíles, es decir, genera todas las combianciones de forma sistemática. ¿Qué pasa si yo solo quiero un grupo al azar de todas las combinaciones posibles que te haría LINQ-to-Objects? .
Claro podrías pensar, genero todas, y luego cojo algunas al azar. Eso vale si son pocas pero ¿Y si son unas 14 millones como en el código que he hecho yo de la Primitiva y solo quiero X < 14 millones al azar?
No se si se podría usar en dicho caso LINQ-to-Objects. Al descubrir "el estilo Elektro" XD, he estado contemplando la posibilidad de usar LINQ-to-Objects, pero no se me ocurre como.
Si ves mi código unos comentarios más atrás, verás que se pueden modificar varios valores como NumCombinaciones y " For Index As Integer = 1 To 6" o
Dim MisBolas() As String = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40}
Y no tengo que modificar código, ni condiciones para cambiar las combinaciones. Por ejemplo esto generaría combinaciones de la Primitiva pero solo con los números
{2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40}. Se podrían hacer un total de
462 combianciones. Pero el código sólo genera
al azar 100. Que es lo que he establecido en
Dim NumCombinaciones As Integer = 100
(se puede cambiar 100 por 462 y las hace también..)
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ListaComb As New List(Of String) '//Lista de combinaciones
Dim NumCombinaciones As Integer = 100 '<---OJO EN ESTE CASO SOLO LO MAXÍMO SON 462
Dim NewComb As String
ListaComb.Clear()
For B1 As Integer = 1 To NumCombinaciones
While ListaComb.Count < NumCombinaciones
NewComb = GetCombPrimitiva()
ListaComb.Add(NewComb)
ListaComb = ListaComb.Distinct.ToList
Me.Text = "Combinaciones generadas: " & ListaComb.Count
My.Application.DoEvents()
End While
Next B1
ListaComb.Sort()
ListBox1.Items.Clear()
For Each Elem As String In ListaComb
ListBox1.Items.Add(Elem)
Next
End Sub
Public Function GetCombPrimitiva() As String
Dim MisBolas() As String = {2, 6, 10, 11, 17, 20, 24, 34, 38, 39, 40}
Dim Bombo As New List(Of Integer) '//Bombo para meter las bolas
Dim Fila As New List(Of Integer) '//Fila virtual para poner las bolas en orden
Dim Combinación As String = Nothing
Dim NumRandom As New Random
'//Llena el bombo
For Index As Integer = 0 To MisBolas.Count - 1
Bombo.Add(MisBolas(Index))
Next
'//Extrae las bolas
For Index As Integer = 1 To 6
'//Devuelve números del 0 a 48 (49 números, Bola(0): contiene 1, Bola(1): Bolcontiene 2 ...)
Dim Bola As Integer = NumRandom.Next(0, Bombo.Count)
'//Mete la bola en la "fila"
Fila.Add(Bombo(Bola))
'//Quita la bola obtenida del bombo
Bombo.RemoveAt(Bola)
Next
Fila.Sort() 'Ordena la fila de bolas
For Each Bola As Integer In Fila
Combinación += String.Format("{0:00} ", Bola)
Next
Return Combinación
End Function
End Class
Pero, este código tiene un inconveniente. A medida que añade combinaciones a la lista tiene que comprobar que no ha salido antes, y en cuanto el número de combinaciones en la lísta más se acerque al máximo ( en este caso serían 462) más tarda en añadir una nueva combinación a la lista. Porque claro, el código no está pensado para hacer todas, sino una porción del total.
¿Cómo se podría hacer con LINQ-to-Objects? Sin tener que estar modificando las condiciones. Si añado un número más o menos, o dos más, etc. Hay que estar modificando el código. Además que no quiero todos, sino todos o una parte del total al azar. No se me ocurre como se podría aprovechar la ventaja de LINQ-to-Objects. ¿Alguna idea?
S2s
Cita de: Eleкtro en 25 Marzo 2016, 21:11 PM
El mal llamado "Estilo Elektro" se denomina LINQ-to-Objects, es algo más expensivo que un FOR, pero más legible y manejable que un FOR.
Si le ofrezco soluciones basadas en LINQ, es por que supuestamente Luis en su día se puso a practicar con los 101 ejemplos de LINQ oficiales de la galería de código de Microsoft, por lo que está más acostumbrado a este estilo de sintaxis, lo cual, en mi opinión, le resultará de mucha utilidad, puesto que, lo bueno de LINQ, es su versatilidad con esa cantidad de útiles keywords disponibles para realizar típicas operaciones que nos tomarían más tiempo de escritura al traducirlas a un búcle For Range o For Each.
Saludos.
El estilo Elektro jejej, bueno es el que mas cómodo se me hace ya que es cierto lo que dice el yo me acostumbre a linq y se me hace ahora un poco difícil mirar otros metodos
pero ambas son buenas ya que las de lekim son similares a Fox y tampoco es tan difícil
les agradezco a los dos por la ayuda, pero les recuerdo que cada programador lo hace a su manera generalmente pero lo mejor es compartir de todo esto ;-)
Luis