Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: luis456 en 2 Febrero 2014, 13:14 pm



Título: Combinaciones letras o numeros
Publicado por: luis456 en 2 Febrero 2014, 13:14 pm
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
  1. Region " Permute all combinations of characters"
  2.  
  3.    ' [ Permute Characters Function ]
  4.    '
  5.    ' Examples :
  6.    ' Dim Permutations As IEnumerable = Permute_Characters("abc", 2)
  7.    ' For Each Permutation As IEnumerable(Of Char) In Permutations : RichTextBox1.Text &= vbNewLine & Permutation.ToArray : Next
  8.  
  9.    Private Shared Function Permute_Characters(Of T)(list As IEnumerable(Of T), length As Integer) As IEnumerable(Of IEnumerable(Of T))
  10.  
  11.        If length = 1 Then
  12.            Return list.[Select](Function(x) New T() {x})
  13.        Else
  14.            Return Permute_Characters(list, length - 1).SelectMany(Function(x) list, Function(t1, t2) t1.Concat(New T() {t2}))
  15.        End If
  16.  
  17.    End Function
  18.  
  19. #End Region


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

Luis





Título: Re: Combinaciones letras o numeros
Publicado por: Eleкtro en 2 Febrero 2014, 15:51 pm
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:
AAA 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:

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

Saludos!


Título: Re: Combinaciones letras o numeros
Publicado por: luis456 en 2 Febrero 2014, 17:32 pm
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
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.  
  3.        Dim a As Byte
  4.        Dim b As Byte
  5.        Dim c As Byte
  6.        Dim d As Byte
  7.  
  8.        Textbox1.Text = ""
  9.  
  10.        For a = 1 To 4
  11.            For b = 1 To 4
  12.                For c = 1 To 4
  13.                    For d = 1 To 4
  14.                        If a = b Or a = c Or a = d Or b = c Or b = d Or c = d Then
  15.                        Else
  16.                            TextBox2.Text = TextBox1.Text & a & b & c & d & vbCrLf
  17.                        End If
  18.                    Next d
  19.                Next c
  20.            Next b
  21.        Next a
  22.    End Sub
  23.  
  24. 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


Título: Re: Combinaciones letras o numeros
Publicado por: 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
  1. Public Class Form1
  2.  
  3.    ''' <summary>
  4.    ''' Tu array numérico.
  5.    ''' </summary>
  6.    Private IntArray As Integer() =
  7.    {
  8.        10I, 20I, 30I, 40I, 50I, 60I, 70I, 80I, 90I
  9.    }
  10.  
  11.    Private Sub Button1_Click() Handles Button1.Click
  12.  
  13.        TextBox2.Text = String.Join("; ", RandomizeArray(IntArray))
  14.        ' TextBox2.Text = String.Join(Nothing, RandomizeArray(arr))
  15.  
  16.    End Sub
  17.  
  18.    ' By Elektro
  19.    '
  20.    ''' <summary>
  21.    ''' Randomizes the elements of the given Collection.
  22.    ''' </summary>
  23.    ''' <typeparam name="T"></typeparam>
  24.    ''' <param name="Collection">Indicates the Collection to randomize.</param>
  25.    ''' <returns>IEnumerable{``0}.</returns>
  26.    Public Function RandomizeArray(Of T)(ByVal Collection As IEnumerable(Of T)) As IEnumerable(Of T)
  27.  
  28.        Dim Randomizer As New Random
  29.        Return (From Item As T In Collection Order By Randomizer.Next).ToArray
  30.  
  31.    End Function
  32.  
  33. End Class


Título: Re: Combinaciones letras o numeros
Publicado por: luis456 en 3 Febrero 2014, 13:15 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
  1. Public Class Form1
  2.  
  3.    ''' <summary>
  4.    ''' Tu array numérico.
  5.    ''' </summary>
  6.    Private IntArray As Integer() =
  7.    {
  8.        10I, 20I, 30I, 40I, 50I, 60I, 70I, 80I, 90I
  9.    }
  10.  
  11.    Private Sub Button1_Click() Handles Button1.Click
  12.  
  13.        TextBox2.Text = String.Join("; ", RandomizeArray(IntArray))
  14.        ' TextBox2.Text = String.Join(Nothing, RandomizeArray(arr))
  15.  
  16.    End Sub
  17.  
  18.    ' By Elektro
  19.    '
  20.    ''' <summary>
  21.    ''' Randomizes the elements of the given Collection.
  22.    ''' </summary>
  23.    ''' <typeparam name="T"></typeparam>
  24.    ''' <param name="Collection">Indicates the Collection to randomize.</param>
  25.    ''' <returns>IEnumerable{``0}.</returns>
  26.    Public Function RandomizeArray(Of T)(ByVal Collection As IEnumerable(Of T)) As IEnumerable(Of T)
  27.  
  28.        Dim Randomizer As New Random
  29.        Return (From Item As T In Collection Order By Randomizer.Next).ToArray
  30.  
  31.    End Function
  32.  
  33. 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
  1. Public Class Form1
  2.  
  3.    Private TextBoxes As TextBox() = {Nothing}
  4.    Private Result1 As Int32()
  5.    Private _textBox As Object
  6.    Private Property ListBox1Count As Integer
  7.    Private Property Calcular As Object
  8.  
  9.    Private Property TextBox(ByVal TextBoxCount As Short) As Object
  10.        Get
  11.            Return _textBox
  12.        End Get
  13.        Set(ByVal value As Object)
  14.            _textBox = value
  15.        End Set
  16.    End Property
  17.  
  18.    ReadOnly Property Num1 As Int32
  19.        Get
  20.            Return CInt(TextBox1.Text)
  21.        End Get
  22.    End Property
  23.  
  24.    Private Sub Sumar(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  25.  
  26.        Result1 = {Num1 + 10, Num1 + 20, Num1 + 30} _
  27.                  .Distinct().ToArray
  28.    End Sub
  29.    Private Sub Button1_Click() Handles Button1.Click
  30.  
  31.        TextBox2.Text = String.Join(Nothing, RandomizeArray(Result1))
  32.  
  33.    End Sub
  34.  
  35.  
  36.    Public Function RandomizeArray(Of T)(ByVal Collection As IEnumerable(Of T)) As IEnumerable(Of T)
  37.  
  38.        Dim Randomizer As New Random
  39.        Return (From Item As T In Collection Order By Randomizer.Next).ToArray
  40.  
  41.    End Function
  42.  
  43.  
  44. End Class








Título: Re: Combinaciones letras o numeros
Publicado por: Eleкtro en 3 Febrero 2014, 19:01 pm
12 13 55 <--asi es que me hacen falta

¿Y esta linea no te dice nada?:

Código
  1. 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:

Código:
String.Join(Separador, Colección)

Ejemplo:
Código
  1. 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
  1. Public Class Form1
  2.  
  3.    Private Shadows Sub Shown() Handles MyBase.Shown
  4.  
  5.        Dim Elementos As Integer() =
  6.        {
  7.          1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  8.          11, 12, 13, 14, 15, 16, 17, 18
  9.        }
  10.  
  11.        For X As Integer = 0 To Elementos.Count - 1 Step 4
  12.  
  13.            MessageBox.Show(
  14.                String.Format("{0} {1} {2} {3}",
  15.                    Elementos(X),
  16.                    If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
  17.                    If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
  18.                    If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty),
  19.                    "Cuatro Elementos"
  20.                )
  21.            )
  22.  
  23.        Next X
  24.  
  25.        Application.Exit()
  26.  
  27.    End Sub
  28.  
  29. End Class


O puedes hacerlo de forma mas manual:
Código
  1.    Public Class Form1
  2.  
  3.    Private Sub Form1_Load() Handles MyBase.Load
  4.  
  5.        Dim Elementos As Integer() =
  6.        {
  7.          1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  8.          11, 12, 13, 14, 15, 16, 17, 18
  9.        }
  10.  
  11.        Dim Cantidad As Integer = 4
  12.  
  13.        Dim Primeros_Cuatro_Elementos As Integer() =
  14.            (From Elemento As Integer In Elementos
  15.             Take Cantidad).ToArray
  16.  
  17.        Dim Siguientes_Cuatro_Elementos As Integer() =
  18.            (From Elemento As Integer In Elementos
  19.             Skip Primeros_Cuatro_Elementos.Count
  20.             Take Cantidad).ToArray
  21.  
  22.        Dim Todo_El_Resto_De_Elementos As Integer() =
  23.            (From Elemento As Integer In Elementos
  24.             Skip Primeros_Cuatro_Elementos.Count _
  25.             +
  26.             Siguientes_Cuatro_Elementos.Count).ToArray
  27.  
  28.        MessageBox.Show(String.Join(Convert.ToChar(Keys.Space), Primeros_Cuatro_Elementos), "Primeros_Cuatro_Elementos")
  29.        MessageBox.Show(String.Join(Convert.ToChar(Keys.Space), Siguientes_Cuatro_Elementos), "Siguientes_Cuatro_Elementos")
  30.        MessageBox.Show(String.Join(Convert.ToChar(Keys.Space), Todo_El_Resto_De_Elementos), "Todo_El_Resto_De_Elementos")
  31.  
  32.        Application.Exit()
  33.  
  34.    End Sub
  35.  
  36. End Class

Saludos.


Título: Re: Combinaciones letras o numeros
Publicado por: luis456 en 6 Febrero 2014, 20:09 pm
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
  1. Public Class Form1
  2.  
  3.    Private Shadows Sub Shown() Handles MyBase.Shown
  4.  
  5.        Dim Elementos As Integer() =
  6.        {
  7.          1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  8.          11, 12, 13, 14, 15, 16, 17, 18
  9.        }
  10.  
  11.        For X As Integer = 0 To Elementos.Count - 1 Step 4
  12.  
  13.            MessageBox.Show(
  14.                String.Format("{0} {1} {2} {3}",
  15.                    Elementos(X),
  16.                    If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
  17.                    If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
  18.                    If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty),
  19.                    "Cuatro Elementos"
  20.                )
  21.            )
  22.  
  23.        Next X
  24.  
  25.        Application.Exit()
  26.  
  27.    End Sub
  28.  
  29. End Class

Luis



Título: Re: Combinaciones letras o numeros
Publicado por: Eleкtro en 6 Febrero 2014, 20:31 pm
Código
  1. For X As Integer = 0 To Elementos.Count - 1 Step 4
  2.  
  3.    MessageBox.Show(
  4.        String.Format("{0} {1} {2} {3}",
  5.                      Elementos(X),
  6.                      If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
  7.                      If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
  8.                      If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty), "Cuatro Elementos"))
  9.  
  10. Next X

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

Código
  1. For X As Integer = 0 To Elementos.Count - 1 Step 4
  2.  
  3.    ListBox1.Items.Add(
  4.        String.Format("{0} {1} {2} {3}",
  5.                      Elementos(X),
  6.                      If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
  7.                      If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
  8.                      If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty)))
  9.  
  10. Next X

Saludos!


Título: Re: Combinaciones letras o numeros
Publicado por: luis456 en 6 Febrero 2014, 20:55 pm
Fíjate bien en los cambios, esto puedes hacerlo sin ayuda

Código
  1. For X As Integer = 0 To Elementos.Count - 1 Step 4
  2.  
  3.    ListBox1.Items.Add(
  4.        String.Format("{0} {1} {2} {3}",
  5.                      Elementos(X),
  6.                      If(Not (X + 1) >= Elementos.Count, Elementos(X + 1), String.Empty),
  7.                      If(Not (X + 2) >= Elementos.Count, Elementos(X + 2), String.Empty),
  8.                      If(Not (X + 3) >= Elementos.Count, Elementos(X + 3), String.Empty)))
  9.  
  10. 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





Título: Re: Combinaciones letras o numeros
Publicado por: Eleкtro en 7 Febrero 2014, 11:02 am
Nah, no soy ningún prodigio como programador ni como tutor, solo es que tengo paciencia xD.

Citar
saltar 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


Título: Re: Combinaciones letras o numeros
Publicado por: luis456 en 7 Febrero 2014, 13:52 pm
A  petición de elektro :)

Bien este código forma grupos de cuatro en cuatro lo que tiene la variable hasta acabar con todos los números

variable-->  1 2 3 4 5 6 7 8 9 10 11 12 13 estos números pueden llegar asta el 90

el código me muestra ahora esto

1 2 3 4
5 6 7 8
9 10 11 12

Bien la idea es cojer dos numeros 1 2 y combinarlos con 10 y 11 y seguir:

ejemplo

1 2 10 11
3 4 10 11
5 6 10 11
7 8 10 11
9 10 11 12
9 10 11 13

esto se repetiría hasta fin de ciclo

espero se entienda :)

Luis


Título: Re: Combinaciones letras o numeros
Publicado por: luis456 en 8 Febrero 2014, 11:43 am
Difícil ee  :silbar:

tambien me serviria algunos ejemplos o rutinas de combinaciones para trastear con ellos a ver que tal

luis