Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: luis456 en 22 Marzo 2016, 15:32 pm



Título: Modificar código de combinaciones de números
Publicado por: luis456 en 22 Marzo 2016, 15:32 pm
Hola ya de nuevo por acá con mis números raros :) para combinar, esto también le puede servir a quien le guste sacar o crear claves de logins y cosas por el estilo  :silbar:

Bien aunque he logrado modificar algunas cosas de este código me gustaría saber como funciona,  ahora combina una cadena de números de dos en dos y ahora busco combinar la cantidad que sea o de tres o de cuatro o mas combinaciones bajo el mismo concepto que tiene ahora

Código
  1. Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 24, 35, 44, 49 ,55 ,77 ,88}
  2.  
  3.        Dim pairsCol As IEnumerable(Of String) =
  4.            From value1 As Integer In intCol
  5.            Select String.Join(Environment.NewLine, (
  6.                               From value2 As Integer In intCol
  7.                               Where (value2 <> value1)
  8.                               Select String.Format("{0:00}, {1:00}", value1, value2)))
  9.  
  10.        For Each pairs As String In pairsCol
  11.            Console.WriteLine(pairs)
  12.            Console.WriteLine("------")
  13.            MessageBox.Show(pairs)
  14.  
  15.        Next
  16.    End Sub

Luis

 


Título: Re: Modificar código de combinaciones de números
Publicado por: Eleкtro en 22 Marzo 2016, 16:16 pm
Creo que me he pasado y he escrito un texto demasiado largo...

Esto es solo para explicarte el funcionamiento del método String.Format(), si no estás interesado ignora este post.



1º:
La función String.Format().

Sirve para asignar un formato específico a una cadena de texto, y devolver la cadena formateada.

Los {n} representan tres cosas, de la tercera ya hablaremos, lo primero que representa es el índice de los argumentos que se especifican a la derecha del formato de la cadena de texto (String.Format("Formato", arg0, arg1, arg2, etc...)), y la posición donde se debe insertar el valor de ese objeto en el formato String.Format("{insertar arg0 aquí} Hola Mundo! {o insertar arg0 aquí}", arg0)).

En este ejemplo
Código
  1. String.Format("C:\{0}.{1}", "Archivo", "txt")

{0} = El primer objeto especificado en el array de argumentos ("archivo")
{1} = El segundo objeto especificado en el array de argumentos ("txt")

Es decir, que este formato:
Código:
"C:\{0}.{1}"

Devolverá esta cadena de texto:
Código:
"C:\Archivo.txt"

Es decir, también, que el siguiente formato seguiría devolviendo el mismo string que antes ("C:\Archivo.txt"), puesto que el formato sigue siendo el mismo a pesar de haber añadido un objeto adicional en el array de argumentos:
Código
  1. String.Format("C:\{0}.{1}", "Archivo", "txt", DateTime.Now())

Para tener en cuenta el o los objetos adicionales que hemos añadido en el array de argumentos, debemos referenciarlos en el formato, especificando sus índices {n}:
Código
  1. String.Format("C:\{0}.{1} {2}", "Archivo", "txt", DateTime.Now())

Eso nos devolvería lo mismo que si concatenasemos el string de esta manera:
Código
  1. "C:\" & "Archivo" & "." & "txt" & " " & DateTime.Now().ToString()
(que cosa más fea)

Es muy sencillo, una vez que se entiende, no tiene misterio, solo son posiciones e índices...

Puedes repetir los índices {n} en el formato cuantas veces quieras, para insertar ese valor en distintas posiciones del string.

Por ejemplo este formato:
Código
  1. String.Format("C:\{0}\{0}\{0}\{1}.{2}", "Carpeta", "Archivo", "txt", DateTime.Now())

Produciría el string:
Código:
C:\Carpeta\Carpeta\Carpeta\Archivo.txt




El formato de los valores.

A los valores de los argumentos también les puedes asignar un formato específico, dentro del formato del string, esto es a lo que me refería con esa tercera cosa que representan los {n}.

Lo mejor es que leas este artículo de MSDN sobre los formatos de los valores:
Custom Numeric Format Strings (https://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx)
( no están todos los formatos que se pueden utilizar para formatear un valor, pero con eso ya tienes suficiente para empezar)

Para especificar un formato de valor, se hace de la siguiente manera {n:FORMATO} donde "FORMATO" sería el formato que le queramos dar, entre los formatos disponibles.

En este ejemplo uso el formato "Zero placeholder" (que puedes leer en el enlace de MSDN):
Código
  1. String.Format("Valor: {0:00}", 1)

Eso lo que hace es rellenar el espacio vacío a la izquierda con un "0" en caso de que el valor del argumento ("1") no ocupe ese espacio, por lo que ese formato devolverá este string:
Código:
Valor: 01

Es practicamente lo mismo que hacerle un padding a un string:
Código
  1. Dim str As String = "1".PadLeft(2, "0"c) ' 01

Te he explicado ese formato por que es el que quieres utilizar, pero hay muchísimos más.


Título: Re: Modificar código de combinaciones de números
Publicado por: Eleкtro en 22 Marzo 2016, 16:18 pm
Para hacer combinaciones permutaciones de más dígitos, es necesario cambiar la lógica de esa query Linq-to-Objects por completo.

Si lo que quieres es obtener todas las combinaciones posibles de los valores contenidos en un array, y de longitud determinada, entonces esto es una solución mejor:

( espera, la estoy buscando en mi API ElektroKit)


Título: Re: Modificar código de combinaciones de números
Publicado por: luis456 en 22 Marzo 2016, 16:42 pm
Creo que me he pasado escrito un texto demasiado largo...


 :o :o :o :o :o :o :o tengo para meses jejjeje

luis


Título: Re: Modificar código de combinaciones de números
Publicado por: Eleкtro en 22 Marzo 2016, 16:54 pm
:o :o :o :o :o :o :o tengo para meses jejjeje

luis

Me he dado cuenta que la función actual que tengo para realizar permutaciones no sirve para tu propósito, puesto que es para caracteres (me refiero, a strings de 1 caracter), y tu quieres hacer permutaciones de los elementos de un array (números de más de 1 dígito), así que ahora mismo no puedo enseñarte nada, por que me llevará su tiempo idear el nuevo algoritmo, lo siento, pero me pondré a ello, por que sería una función muy útil para tenerla siempre a mano.

De todas formas aquí te la dejo para que le heches un vistazo si quieres:
https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/v1.2/Elektro.Cryptography/Tools/CryptoUtil_Permutations.vb

Saludos


Título: Re: Modificar código de combinaciones de números
Publicado por: luis456 en 22 Marzo 2016, 17:05 pm
Me he dado cuenta que la función actual que tengo para realizar permutaciones no sirve para tu propósito, puesto que es para caracteres (me refiero, a strings de 1 caracter), y tu quieres hacer permutaciones de los elementos de un array (números de más de 1 dígito), así que ahora mismo no puedo enseñarte nada, por que me llevará su tiempo idear el nuevo algoritmo, lo siento, pero me pondré a ello, por que sería una función muy útil para tenerla siempre a mano.

De todas formas aquí te la dejo para que le heches un vistazo si quieres:
https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/v1.2/Elektro.Cryptography/Tools/CryptoUtil_Permutations.vb

Saludos

Lo acabo de ver lo voy a probar ,pero permutaciones no es igual a combinaciones ,el codigo de arriba que puse si hace combinaciones, y estoy parado en

Código
  1. Where (value2 <> value1)


lo que me gustaría saber es como mostrar en ves de value1 y value 2, poner dentro de la misma rutina un tercer valor value3

o sea mostrar "  value1 , value2 y value3 " tambien pense en ir duplicando el codigo modificando variables y al final unirlos en un array y irles haciendo un take() pero no se me suena a escribir mucho jajjajaj y miles de fallas seguro

Luis







Título: Re: Modificar código de combinaciones de números
Publicado por: Eleкtro en 22 Marzo 2016, 17:22 pm
lo que me gustaría saber es como mostrar en ves de value1 y value 2, poner dentro de la misma rutina un tercer valor value3

o sea mostrar "  value1 , value2 y value3

¿Te refieres a hacer esto?:

Código
  1.        Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 24, 35, 44, 49, 55, 77, 88}
  2.  
  3.        Dim pairsCol As IEnumerable(Of String) =
  4.            From value1 As Integer In intCol
  5.            From value2 As Integer In intCol
  6.            Select String.Join(Environment.NewLine, (
  7.                               From value3 As Integer In intCol
  8.                               Where (value1 <> value2) AndAlso
  9.                                     (value1 <> value3) AndAlso
  10.                                     (value2 <> value3)
  11.                               Select String.Format("{0:00}, {1:00}, {2:00}",
  12.                                                    value1, value2, value3)))
  13.  
  14.        For Each pairs As String In pairsCol
  15.            Console.WriteLine(pairs)
  16.            Console.WriteLine("------")
  17.            MessageBox.Show(pairs)
  18.  
  19.        Next

Código:
01, 03, 04
01, 03, 05
01, 03, 08
01, 03, 13
01, 03, 24
01, 03, 35
01, 03, 44
01, 03, 49
01, 03, 55
01, 03, 77
01, 03, 88

PD: En el ejemplo de @Lekim lo harías añadiendo otro For para tener una nueva iteración con una nueva variable y utilizarla, esto es más o menos lo mismo, la cuestión es añadir.

Saludos


Título: Re: Modificar código de combinaciones de números
Publicado por: luis456 en 22 Marzo 2016, 17:42 pm

" AndAlso " me cag... mira que lo pensé en serio, buaaa ya tengo 56 años " y si es eso  :¬¬ lo que andaba buscando , ahora puedo formar grupos de números combinados

gracias de nuevo y ya veo lo senil que me estoy poniendo :(


Gracias Elektro

Luis


Título: Re: Modificar código de combinaciones de números
Publicado por: Eleкtro en 22 Marzo 2016, 18:57 pm
No te preocupes, AndAlso y OrElse son unos keyword sencillos de recordar, pero claro hay que acostumbrarse y practicar para que se quede todo bien memorizado, ahora que sabes como hacerlo seguro que te será mas facil en el futuro

saludos!