elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Ejercicio básico de combinaciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicio básico de combinaciones  (Leído 28,860 veces)
luis456


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Ejercicio básico de combinaciones
« en: 25 Abril 2021, 11:21 am »

Hola a Todos
Tengo algún tiempo sin programar y se me ha olvidado algunas cosas ya muchos me conocéis, como siempre he trabajado sobre la base de dos dígitos, ahora se me ocurre hacerlo con 6 0 8 números y que me haga las combinaciones del 01 al 49 y si claro es para loterías jejej .bien mi idea es la siguiente :

introduzco seis números  ejemplo  1, 4, 5, 7, 8, 9  y que con estos números se me formen resultados de 6 números :

14 15 17 18 19
41 45 47 48 49

como vemos la condición es que no se formen números mayores a 49

Encontre este codigo dentro de mis archivos pero creo es de excel y quiero convertirlo a Net

Código
  1. Sub Combinacion()
  2. i = 1
  3. For b1 = 1 To 61
  4.    For b2 = b1 + 1 To 62
  5.        For b3 = b2 + 1 To 63
  6.            For b4 = b3 + 1 To 64
  7.            Cells(i, 1) = b1
  8.            Cells(i, 2) = b2
  9.            Cells(i, 3) = b3
  10.            Cells(i, 4) = b4
  11.            Range("E1") = i
  12.            i = i + 1
  13.            Next
  14.        Next
  15.    Next
  16. Next
  17. End Sub


A ver quien le echa una mano a este VIEJO jejej y espero para este septiembre 14 me feliciten por mis 61 años 😨

Luis









En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
K-YreX


Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #1 en: 25 Abril 2021, 12:28 pm »

Yo diría que algo así te puede servir:
Código
  1. int numeroMaximo = 49;
  2. int[] digitos = { 1, 4, 5, 7, 8, 9 };
  3. List<int> numerosGenerados = new List<int>();
  4.  
  5. int decenaMaxima = numeroMaximo / 10;
  6. int unidadMaxima = numeroMaximo % 10;
  7.  
  8. for(int i = 0; i < digitos.Length && digitos[i] <= decenaMaxima; ++i)
  9.  for(int j = 0; j < digitos.Length && (digitos[i] < decenaMaxima || digitos[j] <= unidadMaxima); ++j)
  10.    numerosGenerados.Add(digitos[i] * 10 + digitos[j]);
** Para que el algoritmo anterior funcione correctamente el array de dígitos debe estar ordenado.
Las condiciones de los bucles for() no son muy complicadas pero cualquier duda no dudes en comentarla.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #2 en: 25 Abril 2021, 19:54 pm »

Como lo que quieres es guardar la distancia entre los números y tales repartirlos entre el conjunto limitado del rango 1-49, es adecuado que primero se busque el mayor de la serie, así sabes que el límite mayor será: 49 - valormayor. (el array no necesita estar ordenado).

El limite inferior es 1, luego con un bucle puedes recorrer todas las combinaciones posibles... y con otro dentro formar los valores de cada combinación, sumando el ciclo actual a cada uno de los valores del array recibido...

Código:
funcion Combinaciones(array de bytes nums())
    byte j, k, max
    string combinacion

    max = (49 - MayorEn(nums))
    bucle para j desde 1 hasta max)
        Si (j= nums(0)) imprimir  "Esta es la combinacion recibida."

        bucle para k desde 0 hasta nums.length -1                    
            combinacion = (combinacion & (nums(k) + j).tostring)
        siguiente

        imprimir j.tostring, combinacion
        combinacion = ""
    siguiente

    imprimir "Con estos valores, pudieron formarse " & j.tostring & " combinaciones distintas.
fin funcion

byte = funcion MayorEn(array de bytes valores())
    entero k
    byte j = valores(0)  

    bucle para k desde 1 hasta valores.length-1
        si (valores(k) > j)
            j = valores(k)
        fin si
    siguiente
    
    devolver j
fin funcion




p.d.: Viendo que no eres capaz de pasar ese simple código a NET, me parece que quizás tampoco seas capaz de pasar este pseudocódigo, así que te lo he pasado yo mismo y te muestro una simple captura de la interfaz...


La interfaz es muy simple, un textbox, un boton y un listbox para recoger la lista...
Cuando pulsas el botón trata de crear el array con los valores (no verifica si están en el rango 1-49, pero si no es siquierra un byte 'cantará error'... en fin se supone que la se usará a sabiendas de los valores que vas a introducir, luego huelga hacer una comprobación, si comprueba que al menos haya 6 valores (ese despite si es fácil que ocurra)... Por lo mismo que antes, tampoco verifica que no haya numeros repetidos...

Luego se invoca una función que vacía a la lista y la rellena con todas las combinaciones posibles... cuando mayor sea el valor mayor de la serie, tantas menos combinaciones habrá. Nota que la serie no precisa estar ordenada, NEt dispone de su propios métodos para hallar el valor mayor en un array, lo que nos evita escribir una función...

Y aquí el código...
Código
  1. Imports System.Text
  2.  
  3. Public Class Form1
  4.  
  5.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.        Dim Nums() As String, txt As String
  7.        Dim Valores() As Byte, k As UInt16
  8.  
  9.        txt = TextBox1.Text.Replace(" ", "")
  10.        Nums = txt.Split(",")
  11.        If (Nums.Length = 6) Then
  12.            ReDim Valores(0 To 5)
  13.            For k = 0 To 5
  14.                Valores(k) = System.Byte.Parse(Nums(k))
  15.            Next
  16.            Call Combinaciones(Valores)
  17.        Else
  18.            MessageBox.Show("No, no no... Debe haber 6 y solo 6 numeros, separados por 1 coma...")
  19.        End If
  20.    End Sub
  21.  
  22.    Private Sub Combinaciones(ByVal Valores As Byte())
  23.        Dim j, k, max As Byte
  24.        Dim combinacion As String = ""
  25.  
  26.        ListBox1.Items.Clear()
  27.        max = (49 - Valores.Max)
  28.        For j = 0 To max
  29.            For k = 0 To 5
  30.                combinacion &= ((Valores(k) + j).ToString) & ", "
  31.            Next
  32.  
  33.            ListBox1.Items.Add(combinacion)
  34.            combinacion = ""
  35.        Next
  36.    End Sub
  37. End Class
  38.  

« Última modificación: 25 Abril 2021, 20:36 pm por Serapis » En línea

luis456


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #3 en: 26 Abril 2021, 16:59 pm »

 ;-) ;-) ;-) ;-) ;-)
Gracias de verdad gracias a todos aunque todavía no he probado ninguno de vuestros códigos (no he podido ya que estoy en otro PC ) y no tengo instalado el Visual Net y por ser esclavo (digo que tengo que trabajar ;( ) no he tenido tiempo de probar pero ya lo hare y de verdad que estoy super agradecido con todos

saludos
Luis
En línea

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


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #4 en: 1 Mayo 2021, 11:27 am »

Hola a todos de nuevo al ataque jjejej

Por fin instale de nuevo el Visual y he podido probar el código de Serapis

Codigo

Código
  1. Imports System.Text
  2.  
  3. Public Class Form1
  4.  
  5.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.        Dim Nums() As String, txt As String
  7.        Dim Valores() As Byte, k As UInt16
  8.  
  9.        txt = TextBox1.Text.Replace(" ", "")
  10.        Nums = txt.Split(",")
  11.        If (Nums.Length = 6) Then
  12.            ReDim Valores(0 To 5)
  13.            For k = 0 To 5
  14.                Valores(k) = System.Byte.Parse(Nums(k))
  15.            Next
  16.            Call Combinaciones(Valores)
  17.        Else
  18.            MessageBox.Show("No, no no... Debe haber 6 y solo 6 numeros, separados por 1 coma...")
  19.        End If
  20.    End Sub
  21.  
  22.    Private Sub Combinaciones(ByVal Valores As Byte())
  23.        Dim j, k, max As Byte
  24.        Dim combinacion As String = ""
  25.  
  26.        ListBox1.Items.Clear()
  27.        max = (49 - Valores.Max)
  28.        For j = 0 To max
  29.            For k = 0 To 5
  30.                combinacion &= ((Valores(k) + j).ToString) & ", "
  31.            Next
  32.  
  33.            ListBox1.Items.Add(combinacion)
  34.            combinacion = ""
  35.        Next
  36.    End Sub
  37. End Class

Bueno funciona bien dentro lo que cabe pero no hace lo que que quiero al 100 % ya que me hace combinaciones con números que no están dentro de los que introduzco:

Ejemplo

si introduzco  2 , 3 , 5 , 7 , 8 , 9

primero los números que se deben formar son  23 25 27 28 29 después 32 35  37 38 39  y con estos números hacer las combinaciones ya que como vemos no hay  0, 4, 1  en este caso serian 12 números a combinar formando combinaciones de 6 que cumplan la condición mirar (bonoloto primitiva) Si nos hacemos ricos lo haremos entre todos jejejje


NOTA (no se como ostias subir una captura de pantalla )


Saludos  todos
Luis






 

En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #5 en: 1 Mayo 2021, 16:57 pm »

No estoy seguro de haberte entendido al final... me confunde esto de:
Citar
...en este caso serian 12 números a combinar formando combinaciones de 6 que cumplan la condición...

Tal que lo que yo creí haberte entendido de tu primer mensaje es que partiendo de una lista de 6 números,  tu quieres 'desplazar' esa combinación a las que permita el rango al que quede restringido manteniendo la distancia entre los valores de la serie de entrada...

Bien... si es eso lo que pides, entonces el fallo es que la serie de entrada que ofreces, es una arbitraria... no la distancia absoluta al número. La solución es simple, se trata de desplazar la serie entrada (a la serie absoluta)...

Más simplemente explicado... Si tu quieres poner números en la forma:
5,8,12,13,14,15
Eso debe llevarse a un desplazamiento absoluto es decir: resta 4 a cada uno de ellos ...introduce por tanto:
1,4,8,9,10,11

(En el listado de combinaciones), la primera combinación debe empezar siempre por 1 y la última debe acabar siempre en 49-valormayor. Por tanto la lista de valores deben contener la distancia de los valores respecto de un punto absoluto (preferible a una distancia relativa con anterior o posterior), siendo el primero el valor más bajo (el 1), así cada valor es una distancia absoluta, que sirve de suma y simplifica toda la operatoria del programa.

Si no quieres hacer el cálculo manualmente (para eso existe la programación). Añade otro textbox y otro boton, cuando quieras escribirlos libremente usa ese textbox. Cuando pulses el botón asociado, buscará el 'valor de resta', que se consigue buscando el menor de la lista y restándole 1 (en el ejemplo previo: valorResta = 5-1), ahora en un bucle se resta dicho valor a cada uno de los términos y deposita en resultado en el otro textbox, e invoca el botón del otro textbox...

Te adjunto el código del nuevo botón (no olvides añadir encima un botón y un textbox, fíjate en la imagen que adjunto más abajo).
Código
  1. ' Desplazar una serie arbitraria a la serie absoluta e invocar el otro botón.
  2. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  3.        Dim Nums() As String, txt As String
  4.        Dim Valores() As Byte, k As UInt16, j As Uint16 = 255
  5.  
  6.        txt = TextBox2.Text.Replace(" ", "")
  7.        Nums = txt.Split(",")
  8.        If (Nums.Length = 6) Then
  9.            ' Buscar el menor:
  10.            ReDim Valores(0 To 5)
  11.            For k = 0 To 5
  12.                Valores(k) = System.Byte.Parse(Nums(k))
  13.                If (Valores(k) < j) Then j = Valores(k)
  14.            Next
  15.            ' Hacer la resta:
  16.            j -= 1
  17.            txt = ""
  18.            For k = 0 To 5
  19.                Valores(k) -= j
  20.                txt = (txt & Valores(k).tostring & ", ")
  21.            Next
  22.  
  23.            ' ahora el textbox1 contiene la serie absoluta (canónica) y por tanto se puede invocar el botón con opera con dicha serie.
  24.            TextBox1.Text = txt.Substring(0, txt.Length - 2)  ' no queremos pasar la última coma.
  25.  
  26.            ' Llamamos directamente el botón-1
  27.            Call Button1_Click(sender, e)
  28.        Else
  29.            MessageBox.Show("No, no no... Debe haber 6 y solo 6 numeros, separados por 1 coma...")
  30.        End If
  31.    End Sub
  32.  



(cambio color de letra que se confunde con el texto capturado en la imagen)
Si resulta que no es lo que quieres es que no he terminado de entenderte, redefine tu problema si puedes con 2 o 3 ejemplos específicos completos, de modo que la claridad de la especificación se manifieste en el ejemplo, o bien que donde fallen tus palabras pueda deducirse del ejemplo...
« Última modificación: 1 Mayo 2021, 17:12 pm por Serapis » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #6 en: 1 Mayo 2021, 18:24 pm »

p.d.: Añado una imagen que clarifique el objetivo que creo entender que es el cometido del programa.

- Puede verse (en blanco) la lista de valores elegibles: 1-49...
- La linea roja son valores (de ejemplo) de tu elección.
Dicha línea (en mi supuesto de lo creo haberte entendido), quieres desplazarla hacia uno u otro lado. Así si la desplazas 5 posiciones a la izquierda, los valores resultantes, serían aquellos que están justo encima de los que contiene la 'linea roja'.
- La línea amarilla, representa el límite de la serie más a la izquierda. Esta es en realidad la línea con la que el programa espera trabajar (ahora se ha añadido un nuevo botón y textbox, para  redactar  la linea roja y convertirla en la amarilla).
- La linea de color cyan, representa (para la serie actual), la combinación resultante más a la derecha que se puede alcanzar (manteniendo la distancia entre valores).
En línea

K-YreX


Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #7 en: 1 Mayo 2021, 21:25 pm »

Yo creo que se está complicando demasiado el problema inicial. Y que bastaría con lo que expuse en su momento.

Yo diría que algo así te puede servir:
Código
  1. int numeroMaximo = 49;
  2. int[] digitos = { 1, 4, 5, 7, 8, 9 };
  3. List<int> numerosGenerados = new List<int>();
  4.  
  5. int decenaMaxima = numeroMaximo / 10;
  6. int unidadMaxima = numeroMaximo % 10;
  7.  
  8. for(int i = 0; i < digitos.Length && digitos[i] <= decenaMaxima; ++i)
  9.  for(int j = 0; j < digitos.Length && (digitos[i] < decenaMaxima || digitos[j] <= unidadMaxima); ++j)
  10.    numerosGenerados.Add(digitos[i] * 10 + digitos[j]);
** Para que el algoritmo anterior funcione correctamente el array de dígitos debe estar ordenado.
Las condiciones de los bucles for() no son muy complicadas pero cualquier duda no dudes en comentarla.

Salida:
Código:
11 - 14 - 15 - 17 - 18 - 19
41 - 44 - 45 - 47 - 48 - 49

Entrada 2:
Código
  1. int[] digitos = {2, 3, 5, 7, 8, 9};

Salida 2:
Código:
22 - 23 - 25 - 27 - 28 - 29
32 - 33 - 35 - 37 - 38 - 39

Las únicas diferencias que veo son:
  • El código expuesto está en C# -> Habría que convertirlo a VB.
  • Aparece también la combinación de un dígito consigo mismo. Esto se corrige así:
Código
  1. for(int i = 0; i <digitos.Length && digitos[i] <= decenaMaxima; ++i)
  2.  for(int j = 0; j < digitos.Length && (digitos[i] < decenaMaxima || digitos[j] <= unidadMaxima); ++j)
  3.    if(i != j) numerosGenerados.Add(digitos[i] * 10 + digitos[j]);
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #8 en: 1 Mayo 2021, 22:03 pm »

Yo no veo que 'se complique'... en realidad hay una optimización, que simplemente añade una sola línea de código y modifica ligeramente 2 lineas... esperaba que cuando ejecutara los cambios si los entendía, pudiera él mismo intentarlo (es algo obvio) o al menos preguntar...


Remplazar el método del mismo nombre por éste y listo.
Código
  1. Private Sub Combinaciones(ByVal Valores As Byte())
  2.        Dim j, k, max, min As Byte
  3.        Dim combinacion As String = ""
  4.  
  5.        ListBox1.Items.Clear()
  6.  
  7.  
  8.        min = (Valores.Min - 1)                     ' Comienzo
  9.        max = (49 + min - Valores.Max)
  10.        For j = 0 To max
  11.            For k = 0 To 5
  12.                combinacion &= ((Valores(k) + j - min).ToString) & ", "
  13.            Next                                            ' Fin
  14.  
  15.            ListBox1.Items.Add(combinacion)
  16.            combinacion = ""
  17.        Next
  18.    End Sub
  19.  
Tiene 2 bucles igual que tu solución, probablemente más sencilos de entender, la concatenaicón de ítems para añadirlo a un listbox tampoco es nada complejo.

El resto de código que queda fuera de las líneas con los comentarios 'comienzo y 'fin, es simplemente manejo de la interfaz.
En línea

luis456


Desconectado Desconectado

Mensajes: 548



Ver Perfil
Re: Ejercicio básico de combinaciones
« Respuesta #9 en: 1 Mayo 2021, 22:28 pm »

Voy a tratar de explicarlo (siempre me pasa lo mismo yo se lo que quiero pero no se explicarlo)

yo tengo  6 dígitos  ejemplo  2 3 5 6 8 9 <--- esos números deberán de formar parejas de esta forma :

de este grupo se toma el 2 y 3 solamente y se combinan con el resto :  5 6 8 9  formando pares de dígitos :

estos son los números resultantes

23  25  26 28 29
32  35  36 38 39

Resultado de esa combinación es esta (no las pongo todas son bastantes )

23,25,26,28,29,32
23,25,26,28,29,35
23,25,26,28,29,36
23,25,26,28,29,38
23,25,26,28,29,39
23,25,26,28,32,35
23,25,26,28,32,36
23,25,26,28,32,38
23,25,26,28,32,39
23,25,26,28,35,36
23,25,26,28,35,38

Como ven solo no salen combinaciones con el cuatro ni el uno ni cero ya que no salen en los números para combinar ( 2 3 5 6 8 9 )

saludos
Luis
En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ejercicio: las posibles combinaciones de una lista [python]
Ejercicios
Ragnarok 5 18,509 Último mensaje 9 Septiembre 2009, 22:16 pm
por do-while
Ayuda en ejercicio basico
.NET (C#, VB.NET, ASP)
The_Saint 2 2,345 Último mensaje 16 Abril 2013, 20:27 pm
por The_Saint
Ejercicio básico Python
Programación General
srg 3 2,602 Último mensaje 30 Octubre 2013, 01:46 am
por Mitsu
Ayuda con ejercicio basico en C « 1 2 »
Programación C/C++
MartaR95 11 6,429 Último mensaje 12 Diciembre 2016, 01:14 am
por MAFUS
Ejercicio Básico de Operadores en C
Programación C/C++
palacio29 4 2,550 Último mensaje 14 Febrero 2017, 20:50 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines