Combinaciones letras o numeros

Iniciado por luis456, 2 Febrero 2014, 13:14 PM

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

luis456

hola trasteando por la Librería de Snippets encontre este codigo de combinaciones creo es de elektro :) ahora como ni idea de usar la regiones, si alguien me puede explicar el codigo como funciona la idea es que con un array que ya tengo con datos este codigo me coja de ese array y me los combine y muestre en un listbox estas combinaciones.

Mi array se llama " resul "  :rolleyes:

Citar
Código (vbnet) [Seleccionar]
Region " Permute all combinations of characters"

   ' [ Permute Characters Function ]
   '
   ' Examples :
   ' Dim Permutations As IEnumerable = Permute_Characters("abc", 2)
   ' For Each Permutation As IEnumerable(Of Char) In Permutations : RichTextBox1.Text &= vbNewLine & Permutation.ToArray : Next

   Private Shared Function Permute_Characters(Of T)(list As IEnumerable(Of T), length As Integer) As IEnumerable(Of IEnumerable(Of T))

       If length = 1 Then
           Return list.[Select](Function(x) New T() {x})
       Else
           Return Permute_Characters(list, length - 1).SelectMany(Function(x) list, Function(t1, t2) t1.Concat(New T() {t2}))
       End If

   End Function

#End Region


AAA y ya estoy con esto del insert code que no me sale joe....

Luis



Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#1
Pero Luis, ¿has leido el título del snippet? xD, ese método no tiene nada que ver con combinar Arrays (y supongo que después de saber eso ya no te interesará el funcionamiento de las órdenes de LINQ).
( Tienes razón el Snippet lo publiqué yo, pero no es de mi propiedad. )

Las #Regiones sirven básicamente para organizar el código, si te fijas, en la IDE puedes expandir/colapsar una región, y así todo queda más armónico y profesional, no tiene ninguna otra utilidad ...son prácticamente comentarios que puedes eliminar.

No sé que más decirte porque semanas atrás ya te habré puesto unos 1.000 códigos diferentes para unir un Array y mostrarlo en un Listbox, el problema hace tiempo que debería estar solucionado pero como no es así postea el código que tienes y el problema que tienes con ese código porque sin problema no puede haber soluciones. ¿Que es lo que pretendes hacer?.

EDITO:
Cita de: luis456 en  2 Febrero 2014, 13:14 PMAAA y ya estoy con esto del insert code que no me sale joe....

¿Te refieres a insertar un código en el post?, pues para ser sincero yo te he editado todos y cada uno de los códigos que has publicado hasta el día de hoy xD, me das trabajo, no porque hayas infringido las normas ni nada por el estilo, es que símplemente me gusta ver un código con su sintaxis correcta (que nunca la usas xD), por eso no te he dicho nada porque las normas no las has infringido, no hay problema, aunque podrías hacer el favor de usar el tag más apropiado con tanto código que publicas:

[code = vbnet] Tu código [ /code]

Saludos!








luis456

#2
Bien lo que seria algo como esto pero en código mas bonito jejej y el proyecto viejo lo acabe gracias a todos :)

Ahora quiero es hacer son combinaciones y no de arrays si no de lo que tiene ese array que son numeros del 00 a 99 ...


Código (vbnet) [Seleccionar]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       Dim a As Byte
       Dim b As Byte
       Dim c As Byte
       Dim d As Byte

       Textbox1.Text = ""

       For a = 1 To 4
           For b = 1 To 4
               For c = 1 To 4
                   For d = 1 To 4
                       If a = b Or a = c Or a = d Or b = c Or b = d Or c = d Then
                       Else
                           TextBox2.Text = TextBox1.Text & a & b & c & d & vbCrLf
                       End If
                   Next d
               Next c
           Next b
       Next a
   End Sub

End Class



Luis
(ahora espero antes de pinchar esto ,que salga lo del insert code ;) )




[MOD]: Genial, pero no hagas doble post utiliza el botón 'Modificar' :P
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#3
No se si te refieres a hacer algo como esto, porque el ejemplo que has dado con datos de typo Byte , con varios 'For Range' "fijos" del 1 al 4 y esa condicional me sigue pareciendo que tiene poco que ver con la pregunta real.

Este código combina todos los elementos de un Array de forma aleatoria, el resultado (en tu caso) son combinaciones de números desordenados.

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

   ''' <summary>
   ''' Tu array numérico.
   ''' </summary>
   Private IntArray As Integer() =
   {
       10I, 20I, 30I, 40I, 50I, 60I, 70I, 80I, 90I
   }

   Private Sub Button1_Click() Handles Button1.Click

       TextBox2.Text = String.Join("; ", RandomizeArray(IntArray))
       ' TextBox2.Text = String.Join(Nothing, RandomizeArray(arr))

   End Sub

   ' By Elektro
   '
   ''' <summary>
   ''' Randomizes the elements of the given Collection.
   ''' </summary>
   ''' <typeparam name="T"></typeparam>
   ''' <param name="Collection">Indicates the Collection to randomize.</param>
   ''' <returns>IEnumerable{``0}.</returns>
   Public Function RandomizeArray(Of T)(ByVal Collection As IEnumerable(Of T)) As IEnumerable(Of T)

       Dim Randomizer As New Random
       Return (From Item As T In Collection Order By Randomizer.Next).ToArray

   End Function

End Class








luis456

Cita de: Eleкtro en  2 Febrero 2014, 18:19 PM
No se si te refieres a hacer algo como esto, porque el ejemplo que has dado con datos de typo Byte , con varios 'For Range' "fijos" del 1 al 4 y esa condicional me sigue pareciendo que tiene poco que ver con la pregunta real.

Este código combina todos los elementos de un Array de forma aleatoria, el resultado (en tu caso) son combinaciones de números desordenados.

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

   ''' <summary>
   ''' Tu array numérico.
   ''' </summary>
   Private IntArray As Integer() =
   {
       10I, 20I, 30I, 40I, 50I, 60I, 70I, 80I, 90I
   }

   Private Sub Button1_Click() Handles Button1.Click

       TextBox2.Text = String.Join("; ", RandomizeArray(IntArray))
       ' TextBox2.Text = String.Join(Nothing, RandomizeArray(arr))

   End Sub

   ' By Elektro
   '
   ''' <summary>
   ''' Randomizes the elements of the given Collection.
   ''' </summary>
   ''' <typeparam name="T"></typeparam>
   ''' <param name="Collection">Indicates the Collection to randomize.</param>
   ''' <returns>IEnumerable{``0}.</returns>
   Public Function RandomizeArray(Of T)(ByVal Collection As IEnumerable(Of T)) As IEnumerable(Of T)

       Dim Randomizer As New Random
       Return (From Item As T In Collection Order By Randomizer.Next).ToArray

   End Function

End Class



Ok ya con esto que me dio elektro medio hice algo jejej bien introduzco el numero y me los combina . pero siempre hay pero jeje nesecito saber como hacer para que me los muestre de esta forma

121355 <ahora me los muestra de esta forma

12 13 55 <--asi es que me hacen falta  y pudiendo limitar la cantidad de números a mostrar esto es que solo me muestre digamos cuatro pares de numeros.los demas que sobran los combine en otra linea hasta acabar con los numeros


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

    Private TextBoxes As TextBox() = {Nothing}
    Private Result1 As Int32()
    Private _textBox As Object
    Private Property ListBox1Count As Integer
    Private Property Calcular As Object

    Private Property TextBox(ByVal TextBoxCount As Short) As Object
        Get
            Return _textBox
        End Get
        Set(ByVal value As Object)
            _textBox = value
        End Set
    End Property

    ReadOnly Property Num1 As Int32
        Get
            Return CInt(TextBox1.Text)
        End Get
    End Property

    Private Sub Sumar(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

        Result1 = {Num1 + 10, Num1 + 20, Num1 + 30} _
                  .Distinct().ToArray
    End Sub
    Private Sub Button1_Click() Handles Button1.Click

        TextBox2.Text = String.Join(Nothing, RandomizeArray(Result1))

    End Sub

   
    Public Function RandomizeArray(Of T)(ByVal Collection As IEnumerable(Of T)) As IEnumerable(Of T)

        Dim Randomizer As New Random
        Return (From Item As T In Collection Order By Randomizer.Next).ToArray

    End Function


End Class







Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#5
Cita de: luis456 en  3 Febrero 2014, 13:15 PM12 13 55 <--asi es que me hacen falta

¿Y esta linea no te dice nada?:

Código (vbnet) [Seleccionar]
TextBox2.Text = String.Join("; ", RandomizeArray(IntArray))

...Es que vamos!!!, Luis, joer... esta claro q no hay manera...

Para separar los números por un espacio, pues, muy óbviamente, debes modificar el string que usas como separador:

String.Join(Separador, Colección)

Ejemplo:
Código (vbnet) [Seleccionar]
MsgBox(String.Join(Convert.ToChar(Keys.Space), {1I, 2I, 3I, 4I, 5I}.ToArray))


Y para lo de seleccionar "pares" de elementos no te aconsejo hacelro desde la función, haz las cosas de forma ordenada,
primero desordenas todos los elementos del array, y luego ese array desordenado (que contiene todos los números) lo usas para ir sacando los que quieras ...esto lo puedes automatizar con un For o usando Linq:

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

   Private Shadows Sub Shown() Handles MyBase.Shown

       Dim Elementos As Integer() =
       {
         1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
         11, 12, 13, 14, 15, 16, 17, 18
       }

       For X As Integer = 0 To Elementos.Count - 1 Step 4

           MessageBox.Show(
               String.Format("{0} {1} {2} {3}",
                   Elementos(X),
                   If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
                   If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
                   If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty),
                   "Cuatro Elementos"
               )
           )

       Next X

       Application.Exit()

   End Sub

End Class



O puedes hacerlo de forma mas manual:
Código (vbnet) [Seleccionar]
    Public Class Form1

    Private Sub Form1_Load() Handles MyBase.Load

        Dim Elementos As Integer() =
        {
          1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
          11, 12, 13, 14, 15, 16, 17, 18
        }

        Dim Cantidad As Integer = 4

        Dim Primeros_Cuatro_Elementos As Integer() =
            (From Elemento As Integer In Elementos
             Take Cantidad).ToArray

        Dim Siguientes_Cuatro_Elementos As Integer() =
            (From Elemento As Integer In Elementos
             Skip Primeros_Cuatro_Elementos.Count
             Take Cantidad).ToArray

        Dim Todo_El_Resto_De_Elementos As Integer() =
            (From Elemento As Integer In Elementos
             Skip Primeros_Cuatro_Elementos.Count _
             +
             Siguientes_Cuatro_Elementos.Count).ToArray

        MessageBox.Show(String.Join(Convert.ToChar(Keys.Space), Primeros_Cuatro_Elementos), "Primeros_Cuatro_Elementos")
        MessageBox.Show(String.Join(Convert.ToChar(Keys.Space), Siguientes_Cuatro_Elementos), "Siguientes_Cuatro_Elementos")
        MessageBox.Show(String.Join(Convert.ToChar(Keys.Space), Todo_El_Resto_De_Elementos), "Todo_El_Resto_De_Elementos")

        Application.Exit()

    End Sub

End Class


Saludos.








luis456

#6
Bueno después de trastear  con este código de elektro logre adaptarlo a mi nuevo proyecto y funciona pero tengo ahora esta pega.

como muestro en ves de un mesaggebox los resultados en un listbox ? ya que trato con  " ListBox1.Items.AddRange(Result1.Cast(Of Object).ToArray) " pero solo me muestra una sola combiancion y este codigo muestra tres mesaggebox

Codigo que estoy usando

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

   Private Shadows Sub Shown() Handles MyBase.Shown

       Dim Elementos As Integer() =
       {
         1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
         11, 12, 13, 14, 15, 16, 17, 18
       }

       For X As Integer = 0 To Elementos.Count - 1 Step 4

           MessageBox.Show(
               String.Format("{0} {1} {2} {3}",
                   Elementos(X),
                   If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
                   If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
                   If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty),
                   "Cuatro Elementos"
               )
           )

       Next X

       Application.Exit()

   End Sub

End Class


Luis

Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Cita de: luis456 en  6 Febrero 2014, 20:09 PM
Código (vbnet,3,8) [Seleccionar]
For X As Integer = 0 To Elementos.Count - 1 Step 4

    MessageBox.Show(
        String.Format("{0} {1} {2} {3}",
                      Elementos(X),
                      If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
                      If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
                      If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty), "Cuatro Elementos"))

Next X


Fíjate bien en los cambios, esto puedes hacerlo sin ayuda

Código (vbnet,3,8) [Seleccionar]
For X As Integer = 0 To Elementos.Count - 1 Step 4

    ListBox1.Items.Add(
        String.Format("{0} {1} {2} {3}",
                      Elementos(X),
                      If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
                      If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
                      If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty)))

Next X


Saludos!








luis456

Cita de: Eleкtro en  6 Febrero 2014, 20:31 PM
Fíjate bien en los cambios, esto puedes hacerlo sin ayuda

Código (vbnet,3,8) [Seleccionar]
For X As Integer = 0 To Elementos.Count - 1 Step 4

    ListBox1.Items.Add(
        String.Format("{0} {1} {2} {3}",
                      Elementos(X),
                      If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
                      If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
                      If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty)))

Next X


Saludos!

Chupado  ;-)  gracias electro a este paso podre decir que estoy con el mejor maestro :)  ahora vere como saltar las combinaciones para que no sean seguidas pero lo tratare de hacer  yo mismo.rompiendo se aprende :)

Luis



Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Nah, no soy ningún prodigio como programador ni como tutor, solo es que tengo paciencia xD.

Citarsaltar las combinaciones para que no sean seguidas
Creo que tarde o temprano vas a acabar preguntándolo, mejor hazlo ahora, aquí estamos para ayudar... pero si lo preguntas haz el favor de explicarlo con detalles, no de esa manera que he citado porque no hay quien lo entienda xD.

Saludos