Mis malas combinaciones :(

Iniciado por luis456, 9 Agosto 2014, 15:07 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

#10
Citarasumo que el programa lee que son números desde el 01 al 30 correlativamente ?

Tu input, del 1 al 30:
Cita de: luis456 en 15 Agosto 2014, 21:16 PMinput
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Mi input, del 1 al 30:
Citar
Código (vbnet) [Seleccionar]
Enumerable.Range(1I, 30I).ToArray ' 1 to 30

Recuerda que el código que te he ofrecido solo es un algoritmo que mimica los pasos que has explicado en tu ejemplo, es decir: 30 combinaciones del 1 al 30, dando saltos de 3 posiciones, los combos de 10 numeros de longitud cada combo, y con numeros aleatorios dentro de un rango específico en los espacios libres a rellenar.




Citarno es la idea
¿Que te impide modificar manualmente el array?:

Código (vbnet) [Seleccionar]
ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 99, etc...}

El código actuará (o debería actuar) de la misma manera.




Citardonde muestro los resultados  estoy poniendo esto pero solo me sale  " colección "

Es que le estás intentando pasar una colección que tiene más colecciones dentro, es decir, una Lista de Listas (List(Of List(Of Integer))), debes pasarle solo las colecciones del interior, las sub-listas de la lista (List(Of Integer)) y tienes que pasarselas como String.

Puedes hacerlo por ejemplo de una de estas dos maneras:

1.
Código (vbnet) [Seleccionar]
       Combos.ForEach(Sub(comb As List(Of Integer))
                          ListBox1.Items.Add(String.Join(", ", comb))
                      End Sub)


2.
Código (vbnet) [Seleccionar]

       ListBox1.Items.AddRange(
           (From comb As List(Of Integer) In Combos
            Select String.Join(", ", comb)).ToArray
        )





De todas formas habia un fallo con la colección Combos (al utilizar el método Combo.Clear se limpiaba también la referencia del Combo que habia dentro de Combos, por ende al final Combos resultaba ser una colección de listas vacías) así que te dejo esta nueva versión corregida y con el ejemplo del Listbox:

Código (vbnet) [Seleccionar]
Public Class LuisClass_v2

   ReadOnly Randomizer As New Random

   ReadOnly FixedValues As Integer() =
       Enumerable.Range(1I, 30I).ToArray ' 1 to 30

   ReadOnly RandomValues As Integer() =
       Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30

   Dim Combo As List(Of Integer) = Nothing
   Dim Combos As New List(Of List(Of Integer))

   Private Sub Test() Handles MyBase.Shown

       Dim IndexCounter As Integer = FixedValues.First ' 1
       Dim LenCounter As Integer = 0I

       Const NumStep As Integer = 3I
       Const NumLen As Integer = 10I

       Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30

           Combo = New List(Of Integer)

           For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3

               Combo.Add(Num)
               LenCounter += 1I

               If LenCounter >= NumLen Then
                   Exit For
               End If

           Next ' Num

           If LenCounter < NumLen Then ' If LenCounter < 10

               For RandomNum As Integer = 1I To (NumLen - LenCounter)

                   Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last)

                   Do Until Not Combo.Contains(n)
                       n = Randomizer.Next(RandomValues.First, RandomValues.Last)
                   Loop

                   Combo.Add(n)

               Next ' RandomNum

           End If ' LenCounter < NumLen

#If DEBUG Then ' #Debug
           Debug.WriteLine(String.Join(", ", Combo))
           ' Stop
#End If

           Combos.Add(Combo)
           IndexCounter += 1I
           LenCounter = 0I

       Loop ' IndexCounter >= FixedValues.Last

       ' ********
       ' Listbox:
       ' ********
       Combos.ForEach(Sub(comb As List(Of Integer))

                          ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox.
                          ListBox1.Items.Add(String.Join(", ",
                                                         From value As String In comb
                                                         Select If(value.Length = 1I,
                                                                   value.Insert(0I, "0"c),
                                                                   value)))

                      End Sub)

   End Sub ' Test

End Class








luis456

Mil gracias de nuevo ahora si pude hacerlo funcionar :)

Bien aca donde me pones esto , es lo debería de cambiar por mi variable " result " que es la que tiene los números después de efectuada la operación que hago en mi programa ? ya que mi idea es implementarlo a mi programa

Código (vbnet) [Seleccionar]
ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 99, etc...}

por lo demas funciona como queria lo de ordenar de menor a mayor ya me ocupo :)


gracias muchas gracias  :) :)

Luis

Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Cita de: luis456 en 19 Agosto 2014, 13:31 PM
Mil gracias de nuevo ahora si pude hacerlo funcionar :)

Bien aca donde me pones esto , es lo debería de cambiar por mi variable " result " que es la que tiene los números después de efectuada la operación que hago en mi programa ?

Código (vbnet) [Seleccionar]
ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 99, etc...}

¿A cual de las miles de variables que bautizaste con el nombre de "Result" te refieres? :P

Supongo que si, en la variable FixedValues debes especificarle los numeros que se tomarán para hacer las combinaciones, en tu ejemplo pusiste del 1 al 30, no se si harás eso con la variable "result" que mencionas, pero creo que ya te hiciste una idea de lo que debe ir en esa variable FixedValues (valores fijos).

Cita de: luis456 en 19 Agosto 2014, 13:31 PMpor lo demas funciona como queria

Me alegro de oir eso

PD: Por si acaso te recuerdo que para ordenar de mayor a menor lo tienes facil usando una LINQ-query:
Código (vbnet) [Seleccionar]
dim values as integer() = (from n as integer in TUSNUMEROS order by n ascending).toarray

o el método Sort, en una lista.

Saludos!








luis456

Hola porque no me salen los números que he puesto para combinar ? he echo algunos arreglos para combinar con cinco ya que según la cantidad de números en la variable si me paso se queda en un loop esto lo detecta,pero los números que pongo en ella no ?

Código (vbnet) [Seleccionar]
Public Class LuisClass_v2

    ReadOnly Randomizer As New Random

    ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 9, 20, 25}

    ReadOnly RandomValues As Integer() =
        Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30

    Dim Combo As List(Of Integer) = Nothing
    Dim Combos As New List(Of List(Of Integer))

    Private Sub Test() Handles MyBase.Shown

        Dim IndexCounter As Integer = FixedValues.First ' 1
        Dim LenCounter As Integer = 0I

        Const NumStep As Integer = 3I
        Const NumLen As Integer = 5I

        Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30

            Combo = New List(Of Integer)

            For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3

                Combo.Add(Num)
                LenCounter += 1I

                If LenCounter >= NumLen Then
                    Exit For
                End If

            Next ' Num

            If LenCounter < NumLen Then ' If LenCounter < 10

                For RandomNum As Integer = 1I To (NumLen - LenCounter)

                    Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last)

                    Do Until Not Combo.Contains(n)
                        n = Randomizer.Next(RandomValues.First, RandomValues.Last)
                    Loop

                    Combo.Add(n)

                Next ' RandomNum

            End If ' LenCounter < NumLen

#If DEBUG Then ' #Debug
            Debug.WriteLine(String.Join(", ", Combo))
            ' Stop
#End If

            Combos.Add(Combo)
            IndexCounter += 1I
            LenCounter = 0I

        Loop ' IndexCounter >= FixedValues.Last

        ' ********
        ' Listbox:
        ' ********
        Combos.ForEach(Sub(comb As List(Of Integer))

                           ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox.
                           ListBox1.Items.Add(String.Join(", ",
                                                          From value As String In comb
                                                          Select If(value.Length = 1I,
                                                                    value.Insert(0I, "0"c),
                                                                    value)))

                       End Sub)

    End Sub ' Test

End Class
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#14
Cita de: luis456 en 20 Agosto 2014, 13:56 PMporque no me salen los números que he puesto para combinar ?

Por esto:
Citar
Código (vbnet) [Seleccionar]
For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3

              Combo.Add(Num)
              ...

Estás tomando el número de la variable num en lugar de tomar un item de la colección FixedValues, se puede decir que esto ha sido un fallo mio porque como ya sabes en ese ejemplo usé una secuencia ordenada del 1 al 30, así que se me pasó por alto ese detalle al desordenar la secuencia xD.

Prueba a ver si este es el resultado que quieres obtener:
Combo.Add(FixedValues(NumStep * LenCounter))
Edito: o lo que viene a ser lo mismo:

Código (vb) [Seleccionar]
Combo.Add(FixedValues(Num - 1))

Explico:
Para generar la primera combinación con los números que has mostrado, daría saltos de '3' para tomar estas posiciones:
{ 1, , , 22, , , 66, , , 20, }
+ un número aleatorio aleatorio del rango que especificaste EDITO: del rango de 'RandomValues', para dejarlo claro.

Saludos








luis456

Hola

Bueno tengo algunos dias tratando de hacer lo que me pusiste elektro pero no me sale

o me da combianciones raras o me da el error de variable fuera de rango te pongo el codigo a ver donde me estoy pelando


Código (vbnet) [Seleccionar]
Public Class LuisClass_v2

    ReadOnly Randomizer As New Random

    ' Num ReadOnly FixedValues As Integer() =
    ' Num   Enumerable.Range(1I, 49I).ToArray ' 1 to 30

    ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 9, 20, 25}

    ReadOnly RandomValues As Integer() =
        Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30

    Dim Combo As List(Of Integer) = Nothing
    Dim Combos As New List(Of List(Of Integer))

    Private Sub Test() Handles MyBase.Shown

        Dim IndexCounter As Integer = FixedValues.First ' 1
        Dim LenCounter As Integer = 0I

        Const NumStep As Integer = 3I
        Const NumLen As Integer = 6I

        Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30

            Combo = New List(Of Integer)

            For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3

                '  Combo.Add(Num)
                '  LenCounter += 1I

                Combo.Add(FixedValues(NumStep * LenCounter))

                If LenCounter >= NumLen Then
                    Exit For
                End If

            Next ' Num

            If LenCounter < NumLen Then ' If LenCounter < 10

                For RandomNum As Integer = 1I To (NumLen - LenCounter)

                    Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last)

                    Do Until Not Combo.Contains(n)
                        n = Randomizer.Next(RandomValues.First, RandomValues.Last)
                    Loop

                    Combo.Add(n)

                Next ' RandomNum

            End If ' LenCounter < NumLen

#If DEBUG Then ' #Debug
            Debug.WriteLine(String.Join(", ", Combo))
            ' Stop
#End If

            Combos.Add(Combo)
            IndexCounter += 1I
            LenCounter = 0I

        Loop ' IndexCounter >= FixedValues.Last

        ' ********
        ' Listbox:
        ' ********
        Combos.ForEach(Sub(comb As List(Of Integer))

                           ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox.
                           ListBox1.Items.Add(String.Join(", ",
                                                          From value As String In comb
                                                          Select If(value.Length = 1I,
                                                                    value.Insert(0I, "0"c),
                                                                    value)))

                       End Sub)

    End Sub ' Test

End Class
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Código (vbnet) [Seleccionar]
           For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep

               LenCounter += 1I
               Combo.Add(FixedValues(Num - 1I))

               If LenCounter >= NumLen Then
                   Exit For
               End If

           Next Num


PD: no se si ese será el resultado que quieres obtener, pero esa es la correción para que funcione el código.

saludos!








luis456

Ahora si :) ya me toma los numeros y los combina

ya estoy con lo del ordenamiento de menor a mayor pero me da este error que un valor de sistems no se puede convertir a string

Código (vbnet) [Seleccionar]
' ******** ordenamiento-------------
        Dim values As Integer() = (From n As Integer In Combos Order By n Ascending).ToArray

        ' ********
        ' Listbox:
        ' ********
        Combos.ForEach(Sub(comb As List(Of Integer))

                           ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox.
                           ListBox1.Items.Add(String.Join(", ",
                                                          From value As String In comb
                                                          Select If(value.Length = 1I,
                                                                    value.Insert(0I, "0"c),
                                                                    value)))

                       End Sub)

    End Sub ' Test




saludos
Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#18
¿Que habiamos hablado sobre dar detalles específicos del error?.

De decir esto:
Cita de: luis456 en 26 Agosto 2014, 06:52 AMme da este error que un valor de sistems no se puede convertir a string

A esto:
Value of type 'System.Collections.Generic.List(Of Integer)' cannot be converted to 'String'.

...hay todo un trecho. y ya si indicases que instrucción es la que te da error, mejor aún.




Si has modificado la declaración de Combos entonces muestrala (Dim Combos As...)

El código me funciona, ¿quizás tengas activado Option Strict On?

Prueba así:

Código (vbnet) [Seleccionar]
   ListBox1.Items.Add(String.Join(", ",
                                  From value As Integer In comb
                                  Select If(CStr(value).Length = 1I,
                                            CStr(value).Insert(0I, "0"),
                                            CStr(value))))


Saludos!








luis456

Hola

Bien sigo probando no he modificado nada del codigo solo añadi la rutina que me pusiste arriba y esta es la que me da  " Error 1 Un valor de tipo 'System.Collections.Generic.List(Of Integer)' no se puede convertir en 'Integer'. "

Código (vbnet) [Seleccionar]
Dim values As Integer() = (From n As Integer In Combos Order By n Ascending).ToArray

lo que busco es ordenar las combinaciones que se muestran en el listbox ordenados de menor a mayor


luis
Que tu sabiduria no sea motivo de Humillacion para los demas