Título: Ejercicio básico de combinaciones Publicado por: luis456 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
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 Título: Re: Ejercicio básico de combinaciones Publicado por: K-YreX en 25 Abril 2021, 12:28 pm Yo diría que algo así te puede servir:
Código ** 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. Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis 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()) 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... (https://i.imgur.com/8vPvshT.png) 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
Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 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 Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 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
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 Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis 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
(https://i.imgur.com/CfzDfPM.png) (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... Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis 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). (https://i.imgur.com/rsuxhR1.png) Título: Re: Ejercicio básico de combinaciones Publicado por: K-YreX 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 ** 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 Entrada 2: Código
Salida 2: Código: 22 - 23 - 25 - 27 - 28 - 29 Las únicas diferencias que veo son:
Código
Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis 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 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. Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 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 Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 1 Mayo 2021, 23:20 pm Ok... es algo muy distinto a lo que yo entendí.
Tu quieres ¿todas? las permutaciones de 2 grupos de cifras. Donde el primer grupo está formado por las 2 primeras cifras, y el segundo por las otras 4 cifras. Aún me queda otra duda, a ver si me la resuelves antes de que cierre la página... A - ¿El primer grupo solo y siempre puede formar parte en las decenes y el segundo solo y siempre de las unidades (o viceversa, pero solo y siempre)? B - ¿... o pueden igulamente ser intercambiados mientras el dígito en la unidad sea de un grupo distinto al dígito en la decena?. Esto si sería de verdad 'todas' las permutaciones posibles. Título: Re: Ejercicio básico de combinaciones Publicado por: K-YreX en 2 Mayo 2021, 14:28 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... No me refería a que se complicase el código (que entiendo que el tuyo es más extenso por haber incluido código de la interfaz) sino a lo de mantener la distancia entre los números y generar números con dígitos que no están entre los introducidos.Al final ha resultado que yo tampoco lo estaba terminando de entender pero creo que ahora ya sí. A - ¿El primer grupo solo y siempre puede formar parte en las decenes y el segundo solo y siempre de las unidades (o viceversa, pero solo y siempre)? A mí entender, una vez tienes todos los grupos posibles (menores a 49) de 2 dígitos con los dígitos dados, hay que crear digamos filas combinando 6 de esos grupos.B - ¿... o pueden igulamente ser intercambiados mientras el dígito en la unidad sea de un grupo distinto al dígito en la decena?. Esto si sería de verdad 'todas' las permutaciones posibles. Estando ahora en lo cierto, según mis códigos anteriores ya teníamos en numerosGenerados todos los números menores a 49 generados. Ahora habría que combinar dichos números para crear los nuevos grupos (cada uno formado por 6 números de los generados). Pongamos el siguiente caso (cogido de uno de los códigos anteriores): Código: digitos = { 1, 4, 5, 7, 8, 9 } Podemos ver que X1 nunca podrá ser 44 o mayor porque entonces nos faltarían números para completar el grupo. De la misma manera X2 nunca podrá 11 (porque entonces cuál sería X1??) ni 45 o mayor por lo mismo que antes. Haciendo el mismo cálculo con cada uno podemos sacar el siguiente código: Código PD: El código se puede simplificar pero así creo que es más fácil de entender. SALIDA: Código: 11 14 15 17 18 19 Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 2 Mayo 2021, 16:46 pm No me refería a que se complicase el código (que entiendo que el tuyo es más extenso por haber incluido código de la interfaz) sino a lo de mantener la distancia entre los números y generar números con dígitos que no están entre los introducidos. Ok... creí que te referías al código.Al final ha resultado que yo tampoco lo estaba terminando de entender pero creo que ahora ya sí.A mí entender, una vez tienes todos los grupos posibles (menores a 49) de 2 dígitos con los dígitos dados, hay que crear digamos filas combinando 6 de esos grupos. Sí. Yo entendí una cosa claramente al comienzo, pero cuando luego dijo una frase, que 'no encajaba', entonces percibí que podría estar queriendo algo distinto, aunque no tan distinto. Resulta confuso, colocar dos parámetros con distinta aplicación semántica como si fueran uno solo y mismo. Aún quedaban algunas dudas anoche, que no respondió... Hace un rato al volver a mirar, veo en los ejemplos son lo suficientemente explícitos para deducir que finalmente quiere formar las dos combinaciones que faltan poniendo como unidad uno de los valores de las decenas si es preciso... Yo lo he resuleto de la siguiente manera (hay varias, una es como ha hecho K-YreX, con varios bucles anidados, en cada bucle se opera solo con el carácter en la posición solicitada)... Sean el Alfabeto los dos grupos de valores, llamémoslo: X,Y, y R,S,T,U Solo hay 8 pares de combinaciones: Resultado de combinar cada uno del 'Grupo de Decenas' con cada uno del 'Grupo de Unidades' XR, XS, XT, XU (0,1,2,3) YR, YS, YT, YU (4,5,6,7) Más las 2 combinaciones de intercambiar de posicion los valores del 'grupo de Decimales' XY, YX (8,9) Cada par de esos 10 se enumeran ahora como 0-9 (como se ve a su derecha), el orden seguido iniciamente era el ahí mostrado (0,1,2,3), pero luego para mantener un orden lo más exacto posible a como aparece en el ejemplo de muestra, en el código se ha variado el orden (he dejado comentado (dos conjuntos distintos)). Ahora, por tanto nos basta reconocer cada par con 1 solo carácter en el rango 0-9. La cantidad de combinaciones totales sería: (10*9*8*7) * (6*5) = 151.200, ahora bien ese es el caso de no poner restricciones a X e Y (como solo toman valores 0-4), se recalcula como: (10*9*8*7) * (5*4) = 5040 * 20 = 100.800 Esa cifra tampoco es definitiva, porque cuando X ó Y son 0, ni R, ni S, ni T, ni U pueden valer 0, luego habría que descontar algunas... como el problema no es calcular dicho valor exacto, lo dejamos ahí que es bastante aproximado. Ahora, como las combinaciones son tomadas de 6 en 6, el numero de combinaciones con esos 10 pares tomados de 6 en 6 son solo: 210. Primero calculamos esas combinaciones que permanecerán estáticas en un array durante la vida del programa... y luego con los valores recibidos lo que se hará es transformar cada una de esas combinaciones conforme a los valores recibidos. El código para mostrar en el listado esas 210 combinaciones se deja comentado (con un botón aparte una vez abierta la ventana se pueden mostrar en el listbox, pero vamos resumiendo van desde 012345 hasta 456789, ninguna de las combinaciones a partir de la inicial es menor que la previa, y así se llega a todas ellas). Ahora el código con breves explicaciones (a las ya dadas) y alguna captura... La ventana recurre a una clase, que crea las 210 permutaciones y que luego dado un índice realiza la transformación. El código de la interfaz, trata simplemente de tomar el string del textbox y convertirlo en los parámetros que debe recibir la función de transformación. No se ha hecho nada especial para verificar que el string del textbox sea correcto, básicamente cada valor debe debe estar separado por una coma (opcionalmente con espacios). Código
Las combinaciones numéricas podrían guardarse a fichero una vez, borrar la función actual para ser remplazada por una que se lea de fichero (requiere menos líneas, pero no merece el esfuerzo solo para ahorrarse una docena de líneas y dejar opaco como se han generado dichas combinaciones)... X e Y, no deberían ser ambos 0, y si uno de ellos es 0 y otro del otro grupo es 0, habrá combinaciones ilegales (no se filtran, pero es fácil reconocerlas porque un valor de dicha combinación tendrá el valor '00', que como se sabe no forma parte de las 'apuestas' que permite la 'primitiva' (01-49). Se podría mejorar la interfaz, poniendo sendos controles para cada dígito, para permitir que cada variable tome un valor en el rango posible (X e y en el rango 0-4 y RSTU en el rango 0-9) y limitarlo de forma exclusiva, de modo que cuando se elija por ejemplo para R el 5, se desactive para S,T y U el 5, etc... así no puede haber valores repetidos. Pero vamos si quien lo usa lo hace con criterio, se supone que sabrá evitar valores ilegales.... queda como ejercicio del interesado cualquier cambio en la simple intrfaz, o al menos no tomar como válidas las combinaciones donde aparezca el par no legal '00', lo que es trivial... y básicamente no merece esfuerzo invertir en modificar la interfaz para ello (otra cosa es que debiera pasarse a un tercero sin idea de lo que debe y no debe introducir). Y finalmente una captura con el ejemplo de muestra de Luis456: 2, 3, 5,6,8, 9 (https://i.imgur.com/vkQuqGv.png) Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 3 Mayo 2021, 08:31 am Gracias Serapis por tu ayuda he estado probando el código y bien vamos Bien jejje pero (siempre hay un pero ) no quiero que me hagas todo el trabajo ,solo explícame como funcionan algunas cosas para yo modificarlo , en el ejemplo anterior usas los números que pongo de ejemplo " 2, 3, 5,6,8, 9 " pero estos números cambian después de cada sorteo (después os explicare como los saco) según voy entiendo el código este toma solo los dos primeros y los combina con el resto ,bien el tema es que como sabemos las decenas son hasta el cuatro y a veces tendría que introducir ejemplo ( 1 , 2 ,4 - 5,7,8 ) y ahora el programa para las combinaciones no toma el cuatro solo el 1 y 2 , he puesto un botón para limpiar y poder hacer pruebas y el código va de maravilla ,pongo el código y algunas observaciones a ver que te parece ?
Código
Despues los adornos se los pongo jejeje saludos Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 3 Mayo 2021, 12:44 pm en el ejemplo anterior usas los números que pongo de ejemplo " 2, 3, 5,6,8, 9 " pero estos números cambian después de cada sorteo (después os explicare como los saco) Que yo ponga ciertos valores de ejemplo, son solo para eso, para ver un ejemplo en marcha. Y puesto a poner un valor de ejemplo, qué mejor que poner los mismos que tu, que se supone que has probado y conoces de la guna manera su resultado, tal que un vistazo te permita descubrir si en efecto hace o no como se espera.Es lógico que esos números cambien con cada sorteo-ocasión... por eso son variables , si no serían constantes y si fueran constantes, entonces bastaría calcularlos una vez al inicio y no haría falta ningún botón... Lo que quiere decir... que los cambies por otros cualesquiera que necesites a cada ocasión (dentro de lo que admite)... según voy entiendo el código este toma solo los dos primeros y los combina con el resto ,bien el tema es que como sabemos las decenas son hasta el cuatro y a veces tendría que introducir ejemplo ( 1 , 2 ,4 - 5,7,8 ) y ahora el programa para las combinaciones no toma el cuatro solo el 1 y 2 Esa linea de código, lo único que hace es eliminar espacios en blanco...Código
La siguiente línea de código, lo que hace es construir un array con cada elemento que resulte tras una coma... Si te fijas en tu texto (que he resltado en negrita y de color rojo), entre el 4 y el -5 falta una coma, luego el 'split' fallará en obtener 6 números, ahí obtendrá una cadena de texto que al intentar parsearlo (yo puse byte.parse, no resulta preciso poner byte.Tryparse, cuando uno mismo es quien escribe los datos, no proceden de una fuente desconocida que 'a saber lo que contiene...'). Más aún, puesto que falta una coma, solo se hallarán 5 indices para el array, luego te saldrá un mensaje diciendo que deben ser 6 numeros separados por coma. Por otro lado (cuando pongas la coma en su sitio), si los dígitos decimales van del 0 al 9, no entiendo por qué pones -5. Recuerda que yo no he puesto más interceptor de errores que distinguir si hay 6 indices en el array. Cada uno de esos valores deben ser 1 solo dígito entre el 0 y el 9, y los dos primeros restringido a un valor entre 0 y 4. Debes ceñirte al formato que tú mismo especificaste mensajes atrás. ' <<<<<<<<<<<<<< ACA CAMBIAN LOS NUMEROS NUNCA SON LOS MISMOS '...Y DEBE TOMAR HASTA EL DIGITO 4 SABEMOS QUE LAS DECENAS SON 0 1 2 3 Y 4 Vamos a ver... tu premisa era que los dos primeros dígitos (solo 2), apuntaban al valor de decenas y los otros 4 siguiente (siempre 4), a los valores de las unidades... Entonces si son solo los dos primeros dígitos, cuál es el problema?. Pueden tomar valores 0-4, pero 'valores', siempre serán solo 2 dígitos... ejemplos: Dec Unidades ------------------ 0,4, 1,6,2,4 2,3, 1,4,0,9 4,2, 6,8,1,3 Como se ve siempre hay dos conjuntos: - El de decenas son siempre dos dígitos, cuyos valores pueden variar entre el 0 y el 4. - El de unidades son siempre 4 dígitos, cuyos valores pueden variar entre el 0 y el 9. Tienes que separar conceptos... En ninguna parte se ha dicho que las decenas hayan de ser cualesquiera dígitos cuyo valores caiga en el rango 0-4, solo se refiere a los 2 primeros dígitos. ...pues esa fue tu premisa, te cito: 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 : Este código, precisamente tiene por objeto obtener como parámetros ambos valores, fíjate como yo los 'desmonto' en dos parámetros (el 'tutti-fruti' es muy mala idea en programación). Citar ' crear los parámetros para la funcion de Transformacion: Lo ideal es que cada uno tuviera su propio textbox, y para impedir introducción de datos incorrectamente mejor usar controles específicos, por ejemplo controles 'numericUpDown', que puedes limitar sus valores con sus propiedades minimun y maximun (abajo te pongo un dibujo a mano alzada de como podría ser), aunque dichos controles, no tienen opción de bloquear valores individuales más allá del rango definido por las propiedades antedichas:' Los dos dígitos de las 'decenas': Decenas(0) = System.Byte.Parse(Nums(0)) Decenas(1) = System.Byte.Parse(Nums(1)) ' Los 4 dígitos de las 'unidades': For k = 2 To 5 Unidades(k - 2) = System.Byte.Parse(Nums(k)) Next Esto suele ser ineficiente... recorrer todos los controles, para vaciar el contenido de 8 o 10 textbox... , he puesto un botón para limpiar y poder hacer pruebas y el código va de maravilla ,pongo el código y algunas observaciones a ver que te parece ? Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click For Each obj As Control In Me.Controls If (TypeOf obj Is TextBox) Then obj.Text = "" End If If (TypeOf obj Is GroupBox) Then For Each caja As Control In obj.Controls If (TypeOf caja Is TextBox) Then caja.Text = "" End If Next End If ListBox1.Items.Clear() Next End Sub Es preferible otras alternativas: Cuando son pocos textbox (pongamos 4-12... uno mismo decide cuando son pocos). Código
Cuando son una cantidad moderada (>12, por ejemplo) Se adjunta una variable de tipo coleccion y en New (tras la llamada a InitializeComponent, o incluso mejor en 'InitializeComponent' al final del todo) se introduce cada control que deba ser borrado de una tacada cuando se pulse el botón 'reset'. Código
Y por último... cuando la cantidad es inmensa y sobretodo si además de borrar el contenido de los textbox hay que restablecer otras propiedades de otros objetos: Es preferible crear una ventana modal, que contenga toda esa interfaz... cuando se quiera borrar todo, o sea hacer un reset... simplemente se cierra la ventana... como cerrar la ventana no es intuitivo de lo que implica, se añade un botón 'Reset' (y dicho botón lo hace de forma transparente al usuario). Desde la ventana principal (o una función main, si esa ventana resultase ser toda la interfaz del programa): - Añade un modulo de código... - Esto iría en dicho módulo y debe indicarse en las propiedades del proyecto, que la aplicación arranca desde 'Main' (en NET se exige que primero debe añadirse el módulo, si no no estará disponible dicha opción)... - Para que incluso esa opción esté disponible, antes hay que hacer antes una de dos cosas (como tu caso no es una aplicación de consola, es la opción 'A'): ---- A - Desmarcar: "Habilitar marco de trabajo de la aplicación". ---- B - Marcar que es una 'aplicación de consola'... Código
En la ventana... añadimos un botón y el código asociado a dicho botón será: Código Esa línea ("Module1.ResetApp = True"), es para distinguir cuando estás haciendo un 'reset' de cuando la aplicación termina de verdad, para salir del bucle en Main... sin ella será como 'el día de la Marmota' con Bill Murray... Esto te permite reabrir la ventana cuantas veces quieras, sin necesidad de cerrar y abrir la aplicación y tendrás la interfaz en su estado inicial, ergo un reset, muy 'barato' en código... ya en la carga de la ventana uno se afana en que cada control tenga el valor inicial que deba tener, luego es preferible delegar en ello cuando es complejo y costoso restablecer un estado inicial. Por último... Código
Cada dígito, representa sobretodo su posición... '012345' equivale a decir 0 el par de digitos XY 1 el par de dígitos XR 2 el par de dígitos XS 3 el par de dígitos XT 4 el par de dígitos XU 5 el par de dígitos YX Son 2 dígitos, porque hay que formar 6 números, olvida que sean 012345, igual podría haber elegido letras... ABCDEF, pero tomandolo como números sale más eficiente en ´calculo' y más rentable en memoria (ocupan 2 bytes por indice, frente a un cadena representando 6 caracteres, que serían 6 bytes por indice). Si 'descomentas' los dos funciones de abajo, añades un botón que referencie al código del botón (aquí se llama button2), y ejecutas el programa y pulsas el botón el listbox se llena con los valores de dicho array... son las 210 combinaciones en 'crudo', son combinaciones abstractas, la función transformar hace un cambio de codificación de los valores de ese array interpretando cada dígito conforme a los dígitos recibidos... es una traducción de código desde uno abstracto y fijo a uno específico, el código para interpretar dicho cambio son los dígitos recibidos. Código Ese array contiene las 210 permutaciones de forma 'condensada' (como la leche), que es más eficiente que recrear desde cero cada vez cada combinación... (la mitad del trabajo, la mitad más 'pesada' se hace una sola vez, durante la creación de la clase). Que lo entiendas o no, ya depende de tus conocimientos y capacidades... pero te pondré un ejemplo: Sean los días de la semana: Lunes, martes, miercoles... Acaso no puede uno ejemplificarlos con números Lunes=1, Martes=2, miercoles= 3... (en programación sería una enumeración)... Entonces yo luego podría querer almacenar datos en la forma: "el trabajador Luis, esta semana trabajó los días: 1,3,5,6". ...por que en una base de datos (por ejemplo), en ese formato ocupa mucho menos espacio que escribir los nombres de los 4 días en que ha trabajado... pero qué si luego uno quiere tener los días textuales, después de todo, uno no sabe 1 es lunes o es martes o incluso domingo... ...pues resulta que deberá haber una decodificación, un cambio de formato... Código Más aún... ese código, vale incluso si cambias de idioma, variando simplemente los valores constantes que son los nombres de los dias de la semana, bastando para ello un parámetro adicional 'idioma', y que derive a un select case u otro, o simplemente que cargue desde fichero, array, base dedatos, etc... los nombres de los días que corresponden al idioma entrado. La función Transformar hace esto último, con cada día que se le pide (al caso se le piden todos)... Ten en cuenta, que cambiar condicionantes en combinatoria, suele suponer tener que tirar todo y rehacerlo de nuevo, por eso antes de empezar, uno debe tener claro y fijo que es lo que pretende hacer. No hay fórmulas universales, tal que una modificación suponga solo cambiar un dato (que a veces pudiera ser, pero por lo general no). Un prisma, un cubo, una esfera... cada uno tiene su fórmula para calcular su volumen... aunque en tal caso si hay una solución universal si 'existe físicamente', pués se sumerge en un líquido y ya Arquímedes y su eureka, solucionaron el caso. No sé si me dejo algo en el tintero, pero creo que ya queda un mensaje largo... adjunto el dibujo antes que lo olvide: (https://i.imgur.com/aXSNnsH.png) Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 3 Mayo 2021, 13:16 pm UFFFF JAJJAJA
Bueno tendré que imprimir esto y llevármelo al trabajo a ver si asimilo todo y muchas gracias por tu paciencia ,pero te explico estoy haciendo pruebas con varios ejemplos y en una de ellas pongo 2 3 4 6 7 8 y no me salen combinaciones con el cuatro si de terminal estilo 24 34 pero no me salen con el cuatro 42 43 etc etc . y lo de las 210 combinaciones no es limitante se supone que con otro digito saldrán mas combinaciones ,no te preocupes por lo demás que aunque no sea experto ,se como hacer que guarde, imprima libere las variables etc , esto lo puse d prisa y corriendo tengo muchos modelos a usar pero me vale para ir viendo como funciona el codigo Código
Y claro que tomare en cuenta tus métodos pero ya tenia mas de dos años sin programar y lo mío es autodidacta aunque no se crea jejje (eso que estudie Cobol y Pascal ) cuando los Dinosaurios no tenían ni disco duro 😲 es que no se como pasar una toma de pantalla para que veas que es lo que hago, porque no entiendo si pongo 1 3 4, 6 7 8 no me salen combinaciones con el cuatro adelante ??? 13 14 31 34 41 43 Saludos Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 3 Mayo 2021, 23:43 pm estoy haciendo pruebas con varios ejemplos y en una de ellas pongo 2 3 4 6 7 8 y no me salen combinaciones con el cuatro si de terminal estilo 24 34 pero no me salen con el cuatro 42 43 etc etc . Esa combinación de dígitos, empieza por 2 y 3, Los dos primeros dígitos de la serie, son los únicos dígitos que son (pueden ser) decenas, los otros 4 solo pueden ser unidades...Si el 4 ha de aparecer como decena, deberá intercambiarse por alguno de los dos primeros: Si tienes 2 3 4 6 7 8 y quieres que el 4 aparezca en las decenas, intercámbialo por ejemplo por el 2: 2 3 - 4 6 7 8 4 3 - 2 6 7 8 Insisito en que fue lo que tú indicaste. Te pedí ejemplos, para en el caso de alguna ambigüedad resolver dudas consultando los ejemplos (a veces puede resultar más fácil terminar de expresar, o acotar lo que alguien quiere poniendo ejemplos)... Citar yo tengo 6 dígitos ejemplo 2 3 5 6 8 9 <--- esos números deberán de formar parejas de esta forma : Si resulta que eso es solo mi interpretación de tu especificación, es que entonces es inexacta, o cuando menos incompleta y exigíria redefinirla con exactitud y rehacerlo todo...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 ... 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 y lo de las 210 combinaciones no es limitante se supone que con otro digito saldrán mas combinaciones ,no te preocupes por lo demás que aunque no sea experto ,se como hacer que guarde, imprima libere las variables etc No. Esas son todas las formas de ordenar los dígitos en las condiciones (actuales) establecidas. Antes bien, según los dígitos pasados, se formará alguna combinación ilegal... No se filtran porque se da por sentado que uno sabe reconocer que cualquier valor fuera dle rango 01-49 es inválido. En realidad, a estas alturas asumo que lo que quieres, no encaja con la especificación resuelta. Podemos hacer un último intento, pero considera entonces que no me pondría con ello mientras no quede todo perfectamente determinado, sin dudas y sin ambigüedades. Rehacer cosas por emerger requisitos que no se dieron cuando se solicitaron, es algo siempre muy molesto y propenso a ser rechazado (porque implica que todo el tiempo previo empleado es completamente inútil, lo que no ofrece garantías de que ahora no fuera a ser distinto)... Y hay que poner ejemplos, sobre todos de los casos 'irregulares', porque cuando uno no se expresa bien, puede verse plasmado en los ejemplos cierta intencionalidad... Considera que el número total de combinaciones de la primitiva eleigiendo 6 número distintos entre el 1 y el 49, viene acotado por la fórmula: (49*48*47*46*45*44) = 10.068.347.520 Con ello quiero indicar que si tu acotación no restringe en cierta medida el número de combinaciones posibles, se puede disparar y resultar impráctico... si al final salen 2 millones de combinaciones (por ejemplo), que aunque sea una minucia respecto de la totalidad, carece de practicidad albergarlas en un listbox y mucho menos recrearlo con cada cambio de uno u otro dígito. Elegir unas pocas combinaciones entre 2 millones, al final no es muy distinto de elegirlas de entre los 10 mil millones... La quiniela por ejemplo son 3^14 = 4.782.969 de permutaciones totales. es que no se como pasar una toma de pantalla para que veas que es lo que hago, porque no entiendo si pongo 1 3 4, 6 7 8 no me salen combinaciones con el cuatro adelante ??? Hay una tecla (Impr Pant) suele estar a la dercha de la tecla F12 (segúne el teclado). Eso hace una captura de la pantalla. Se abre un programa de im agen (basta cualquiera por simple que sea, que permita rcortar y guardar a fichero), se pega la imagen (teclas CTRL+V), y se edita... normalmente para recortar el área que es de interés, se copia y pega la selección (del recorte) como nueva imagen. Luego se guarda a fichero como jpg... cuando tiene texto, e spreferible como png, que conserva mejor los detalles de las letras.Después se localiza el fichero en el disco, y se sube a una página de subida de imágenes (por ejemplo https://www.imgur.com ). Después de subirla a una página, hay que tomar en enlace (de los que ofrezca elegir uno que ponga 'bbCode para foros'), y se pega el enlace en tu respuesta... En realidad se tarda más en explicarlo con detalle que en hacerlo. Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 4 Mayo 2021, 21:24 pm ien Serapis tratare de explicarlo al pelo ya que tienes razon,esta desde el princio mal planteado ,
bueno la idea es poder combinar 6 digitos iniciales que van desde el 0 hasta el 9 (0,1,2,3,4,5,6,7,8,9 ), bien de estos numeros que yo escojo segun una ecuacion matematica (mia) 6 digitos los cuales yo combino segun la tematica de apuesta de la primitiva que ya sabemos es hasta el 49, con estos 6 digitos se deben formar los numeros (decenas) que componen el sorteo ejemplo : introducimos ( 1, 2, 3, 4, 5, 6 ) con estos numeros se formarian los siguientes numeros: 12 13 14 15 16 21 23 24 25 26 31 32 34 35 36 41 42 43 45 46 <----tomariamos hasta aca los numeros para combinarlos entre si formando grupos de 6 51 52 53 54 56 <----ya estos no se toman en cuenta ( se eliminan del calculo) 61 62 63 64 65 <----ya estos no se toman en cuenta ya que se salen del rango max (49) Seguimos: del grupo de arriba tomariamos los numeros desde el 12 hasta el 46, ya que como sabemos las loteria llegan hasta el 49 y habiendo excluido el 51 hasta el 65 nos quedarian desde el 12 hasta el 46 y esos son los numeros que vamos a combinar vamos a calcular otro ejemplo ( 1,3,4,5,7,9 ) se deben de formar los siguientes numeros 13,14,15,17,19 31,34,35,37,39 41,43,45,47,49 y con estos numeros formar las combinaciones posibles de 6 Muy importante es lo siguiente debe tomar en cuenta cuando se introducen los 6 digitos que los digitos( 0 1 2 3 y 4 ) forman las decenas y que se deben combinar con el resto de los digitos y entre si para formar lo que ya sabemos es la forma de juego de la loteria primitiva y bonoloto. gracias de antemano por tu enorme paciencia :) Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 4 Mayo 2021, 23:54 pm A ver si he entendido bien, y simplificando:
Dados 6 digitos cualquiera que sea el orden en que se den, se trata de obtener con ellos todas las combinaciones posibles legales (agrupadas de 6 en 6, claro). Así, un dígito podrá ponerse como decena siempre que sea menor de 5, y un digito mayor de 5 solo podrá ponerse como unidad. Un ejemplo: 7,9,2,1,8,0 01, 12, 17, 18, 19 10, 12, 07, 08, 09 20, 21, 27, 28, 29 ... Es así? Todavía no me queda claro, si podría ser válido algo como: 01, 11, 22, 27, 28, 29 Es decir se permite que si un dígito es menor de 5, combinarse consigo mismo, o queda restringido a combinarse solamente con los demás?. Si no se permite el único modo de formar 11, 22, 33 y 44, es que aaprezca 2 veces ese dígito, como en: 3, 2, 5, 7, 2, 6 Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 5 Mayo 2021, 06:46 am Bien la primera parte esta bien, a si mismo es pero en la parte que me comentas que debe aparecer dos veces el mismo digito no podrá ser ya que son números que no se repiten y además se prestaría a confusión ,si no se puede hacer vamos a dejarlo por ahora (después miramos a hacerlo sin tener que meter dos veces el mismo digito ,por lo demás esta bien a si es como debe funcionar,
Saludos y gracias Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 6 Mayo 2021, 01:02 am Hola.
Hoy he llegado tarde del trabajo, pero todavía he sacado un tiempito para calcular las cantidades... Dado que (ahora) varía la cantidad de unidades y decenas que pueden aparecer, lo adecuado es categorizar, pués a unidades iguales las firmas son las mismas, resumiendo: - Con 0 decenas y 6 unidades: No puede darse: ej: 5,6,7,8,9 ? Falta 1 dígito para poder formar 6 'apuestas'. - Con 1 decenas y 5 unidades: Puede o no aceptarse (técnicamente no, pues estaríamos inventando un dígito 0): ej: 3; 5,6,7,8,9 35, 36, 37, 38, 39, 03? En cualquier caso si se aceptara, sería una sola combinación y por tanto puede 'calcularse' manualmente. Luego puede dejarse fera. - Con 2 decenas y 4 unidades: Salen 210 firmas distintas (son las calculadas anteriormente). XY-RSTU ------------------- XY XR XS XT XU YX YR YS YT YU Ej: 0,1,___6,7,8,9 10, 08, 09, 16, 17, 19 - Con 3 decenas y 3 unidades: Salen 5.005 firmas. XYZ-RST ------------------- XY XZ XR XS XT YX YZ YR YS YT ZX ZY ZR ZS ZT Ej: 0,1,2,___ 7,8,9 20, 17, 28, 09, 27, 12 - Con 4 decenas y 2 unidades: Salen 38760 WXYZ-RS ------------------- WX WY WZ WR WS XW XY XZ XR XS YW YX YZ YR YS ZE ZX ZY ZR ZS Ej: 0,1,2,3,___ 8,9 38,39,13, 01,29, 12 - Con 5 decenas y 1 unidad: Salen 177100 VWXYZ-R ------------------- VW VX VY VZ VR WV WX WY WZ WR XV XW XY XZ XR YV YW YX YZ YR ZV ZW ZX ZY ZR Ej: 0,1,2,3,4,___ 9 20,31,49, 43, 40 En total se aproximan al 1/4 de millón p.d.: Mañana que vengo con más tiempo veré si me da tiempo a hacerlo. p.d.2: Actualizado los valores de las combinaciones (había un error). Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 6 Mayo 2021, 22:52 pm Me ha dado tiempo a rehacer lo que habíamos hecho, el resto es más de lo mismo y mañana en otro ratito lo completo... Al lío...
Dado que ahora tendremos varias categorías, es más eficiente crear una interfaz e implementar una clase por cada categoría, que andar complicando algoritmos con condicionales. El código que tenías del proyecto previo, guardalo o bórralo... los cambios manuales son demasiados y es preferible copiar y pegar. Añade un interfaz al proyecto. Este es el código de la interfaz: Código
Los comentarios los puedes borrar si lo prefieres... NOTA: La interfaz debe llamarse como figura ahí... luego que esté todo el código, podrás cambiarlo si lo prefieres. Añade un módulo de código si no tienes alguno. Algunas funciones y extensiones de métodos se han trasladado aquí. es código estático (independiente de cualquier instancia). Este es el código a añadir dentro del módulo: Código
Se ha añadido alguna función, la principal es 'enumerarCombinacion'. Las extensiones de métodos, son métodos que simplemente cambia la forma en que se llaman. Si tu creas por ejemplo una función Ordenar que ordena un array, lo llamarías así: Código Mediante una extensión, resulta más cómodo, pués se recurre al intellisense, para que pueda invocarse así: Código Con lo que parece un método nativo más del tipo de datos al que se extiende. Naturalmente la extensión solo es aplicable al proyecto actual. Finalmente volvemos a la ventana principal... (se asume que ahora mismo está vacía). Código
Se han sacado las clases fuera de la clase del formulario, por claridad. Ahora hay una instancia de la interfaz 'ICombina', por cada categoría... Se considera una categoría, a cada diferenciación en la relación de cantidad entre dígitos que pueden ser decenas de los que no. Un ejemplo: Sean los dígitos 3, 6, 8, 0, 5, 1 ...hay 3 valores que pueden ser decenas: 0,1 y 3, luego pertenecen a la categoróa asociada a la intancia 'perm3_3 (3 decenas y 3 unidades, para qué complicarnos más en el nombre). Esta diferenciaciónd e categorías es necesaria, porque cada una presenta diferente cantidad de firmas, como ya se señaló en el mensaje anterior. en lo que al código de la función del botón respecta, para hallar a qué categoría pertenece, tras crear el array con los dígitos (nums), lo ordenamos, ahora un recorrido con un bucle nos permite contarlos, y luego selecciona la clase que operará conforme a la categoría reconocida. Se descartan los casos en que haya 0 o 1 decena solo (5,5,6,7,8,9) y (2, 5,6,7,8,9) y también cuando sean 6 decenas (esto directamente lo he descartado, generaría varios millones de combinaciones) En la misma ventana del formulario, bajo la clase de dicho formulario, irán la implementación de cada clase. Como digo, de momento, solo he dejado lista, la conversión d ela primera (que es equivalente a la que ya hice), las otras son básicamente rehacer lo mismo con pequeños cambios en la función transformar, ya mañana en otro ratito, lo completo. Código
Y eso es todo por hoy. Mañana lo completo. Nota que ya se ha aprovechado para ordenar los elementos de cada combinación así además de estar el listado ordenado, también los valores de cada combinación. p.d.: Corrijo, con 6 dígitos como decenas, se generan muchas menos firmas, cuando lo calculé ayer, creí haber leído millones... pués nada, mañana se incluye también y se hace el cambio pertienente para contener su clase y en la llamada del botón considerar el caso. p.d.: Corregido cantidad de combinaciones para 4_2 y 5_1 Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 7 Mayo 2021, 15:40 pm Tengo un momento hoy tras comer, aprovecho para terminarlo...
Antes de nada, es conveniente aclarar que cometí un pequeño error (un '0' donde debí poner una 'O', que como es copia y pega... se tradujo al resto), pero no afecta a lo hecho si no a los que muestro. Esto implica que el numero de combinaciones para los casos de 4-2, 5-1 y 6-0, son mucho menores: Las combinaciones del caso 4 decenas + 2 unidades son 38.760 y no 143.080 Las combinaciones del caso 5 decenas + 1 unidades son 177.100 y no 402.895 Con el de 6 decenas + 0 unidades (no hay dígitos en el rango 5-9), se dan muchísimos casos ilegales de las 177.100 9 de cada 10 son ilegales... o bien tienen 00, o bien un valor repetido dos veces. Se puedne filtrar con ligeras modificaciones, abajo lo vuelvo a mencionar cuando llegue el momento... Código
Realmente la clase 6_0, es casi idéntica a la clase 5_1 (la enumeración es la misma), pero la transformación de los datos difiere. Más aún puesto que alredededor de 9 de cada 10 son ilegales, creo que es inecesario, o al menos filtrar los valores ilegales. Esto es bastante sencillo, simplemente basta reducirlo desde 6 decenas y 0 unidades a 5 decenas y 0 unidades. Habria que modificar ligeramente la función del botón, que ahora exige que haya 6 dígitos, para aceptar el caso de 5 dígitos y si son todos unidades, derivarlo a la nueva clase y si no error. El otro cambio a apalicar sería en la función de enumeración que yace en el módulo... todas las referencias a la cantidad (0-5), debería aceptar un valor sensible al tamaño que se entre, lo cual se toma del parámetro 'Inicio' (por ejemplo), reclamando su longitud -1, es 6-1 para todas excepto para esta que sería 5-1... Si te interesa avisas y rehago esta última clase para filtrar las combinaciones ilegales... una captura de ejemplo. (https://i.imgur.com/BRLyuum.png) Por ultimo, quizás intereses conocer el número de la combinación seleccionada en un momento dado... para cualquier referencia de interés: Código
Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 8 Mayo 2021, 18:06 pm Gracias Serapis
Como te comentado trabajo fuera toda las semana y para mas hoy me han vacunado contra el covid y me tiene un poco nervioso jejej me vacunaron con la estraneca o astranaca o como se llame 🤣 esperare hasta mañana para probar tus códigos (aunque no he trabajado con las clases aparte , pienso que no será difícil ,recuerda que solo soy aficionado pero me afano ya que me encanta la programación y de simple como es el titulo del post ( Ejercicio básico de combinaciones ) esto ya es un bicho grande pero yo encantado ya que he visto mas posibilidades de mejorar los cálculos para encima otros sistemas de loterías pero ese es otro tema (para depues jejej) te aviso Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 8 Mayo 2021, 21:13 pm Tranquilo... esto no es una red social, donde la gente (parece) exigir que le contesten no tardando más de no se qué cuanto tiempo (so pena de enfadarse). Cada uno a su ritmo...
Hice al final también el filtrado para los de 6_0, de dos maneras distintas... Una de ellas simplemente ignora añadir al listbox, las entradas ilegales (al final quedna así alrededor de la mitad), el otro modo de fitrado es tratarlo como lo que son solo 5 dígitos, arroja unas 15500 combinaciones, pero no lo veo interesante por que contiene así solo 5 combinaciones (pero quien sabe si un oquisiera aparte poner el 6º manualmente). Mañana lo comprimo en un zip y lo subo a alguna página de descarga... Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 8 Mayo 2021, 22:59 pm Tranquilo... esto no es una red social, donde la gente (parece) exigir que le contesten no tardando más de no se qué cuanto tiempo (so pena de enfadarse). Cada uno a su ritmo... Hice al final también el filtrado para los de 6_0, de dos maneras distintas... Una de ellas simplemente ignora añadir al listbox, las entradas ilegales (al final quedna así alrededor de la mitad), el otro modo de fitrado es tratarlo como lo que son solo 5 dígitos, arroja unas 15500 combinaciones, pero no lo veo interesante por que contiene así solo 5 combinaciones (pero quien sabe si un oquisiera aparte poner el 6º manualmente). Mañana lo comprimo en un zip y lo subo a alguna página de descarga... Gracias y para esta Hora todavía sigo vivo 😃 ya veremos mañana saludos Luis Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 9 Mayo 2021, 16:52 pm Hola Serapis
Bueno pase mala noche ya que me dio fiebre esta vacuna y ahora tengo un super catarro :( me he puesto un rato con el programa pero no me aclaro que es lo que tengo que hacer o poner para armarlo pensé me seria fácil jeje .me lo llevo al trabajo a ver si por la noche lo puedo terminar saludos Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 10 Mayo 2021, 17:01 pm ...'armar' el programa... bueno, se supone que quien pide tiene alguna idea básica de lo que es un proyecto en el lenguaje que trata... y con leves explicaciones debería entenderlo bien. De todos modos, lo he comprimido en su carpeta y lo subo a una página de descargas.
También he añadido la clase para el caso de 5 decenas y 0 unidades, es decir para introducir solo 5 dígitos (los que pueden actuar como decenas): 0,1,2,3,4 y generar sus permutaciones, y la 6ª combinación introducirla manualmente... El código de esta clase, va al final del fichero 'form1.vb' y por supuesto, tras incluirlo, s eprecisa crear una instancia para invocarlo, etc... (mira el código del proyecto que adjunto, si tienes dudas) Código
Nota que puede ser optimizado para ganar en velocidad de cálculo a cambio de complicar un poco más el algoritmo yacente en la función 'Transformar'. Dado que una combinación y la siguiente suele variar la mayor parte de las veces solo 1 valor de los 6 que tiene la combinación, retener el array 's' (hacerlo estático) y calcular solo el valor o valores que cambian. Pero en lo que a mí respecta te lo dejo así, queda a tu esfuerzo optimizarlo si es de tu interés y preferencia. En general (no siempre) cualquier optimización aplicada tiende a oscurecer el mecanismo del algoritmo, lo que dificulta su entendimiento. Descarga del proyecto: https://workupload.com/file/Nu6FVTcfH2g 15'11Kb. Cuando lo descarges y abras verás en cada fichero el código que adjunta. Los 3 ficheros principales son: Module1.vb, Interface1.vb y Form1.vb que son los que contienen el código y por tanto los que tienes que mirar (o copy-paste). El proyecto exige otros más para poder arrancar en el IDE de VS. (adjunté, la operatoria de 'reset', que explicaba mensajes más arriba, pero igualmente puedes ignorarlo al menos de momento). Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 11 Mayo 2021, 22:27 pm ;-) ;-) ;-) ;-)
Perfecto Serapis funciona de maravilla te has brillado con este programa, aunque claro es inasumible apostar tal cantidad de apuestas ,he echo algunas apuestas "Virtuales " y si las hubiéramos jugados ya seriamos millonarios :silbar: pero no es motivo de desesperanza ya que es cuestión de aplicar variados filtros, algo de estadística y otros métodos personales (aunque esta comprobado que las estadísticas para las loterías no sirven, porque será ??? ) Bien ahora es cuestión de hacer un menú ,guardar apuestas generadas por ejemplo para poder comparar resultados y aciertos con el sorteo (para no hacerlo a mano para eso esta la programación jejje) quien habrá dicho eso :rolleyes: algunos filtros de reducción de apuestas etc ete. Bueno a pesar de que todavía ando con los efectos de la vacuna (me callo fatal esa *****) ya creo que no muero y pienso que este programa vale la pena hacerlo muy completo y puede ser un buen programa y muy eficaz solo es cuestión de ideas y de cálculos . Para el dia de hoy este post lo han visto 4,360 veces me imagino que hay expectativas sobre el desarrollo del programa jejje solo que no veo aportes e ideas. Bueno seguiré probándolo y vemos que tal De nuevo Gracias Serapis ya te contare Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 12 Mayo 2021, 01:11 am La bonoloto, no se presta a muchas estadísticas, por la enorme cantidad de permutaciones que tolera, y como solo se juega una vez a la semana... pués aunque reúnas los sorteos de 20 años, no creo que dé para sacar conclusiones.
En los casinos (por ejemplo), pequeños fallos en la fabricación o montaje de mesas de apuestas, y la puesta en escena de otros juegos, pueden manifestar 'debilidades', precisamente porque se juegan mas apuestas en un solo día que la bonoloto en todo un año... Si hay 'debilidades' en el sistema, puede ser atacado matemáticamente. Mi cuñado solía jugar a la bonoloto, yo nunca he jugado, por lo que aunque conozco el juego, no los detalles de las reglas. En tú eliges 6 números y deben cincidir todos, entonces jugar alguna número más, reduce las posibilidades combinatorias (aumentan la sposibilidades de acertar), porque siguen bastando 6 combinaciones en una apuesta de 7 números, pero como no me sé las reglas, y por ello no sé si es posible apostar 7 números y si en tal caso (el precio de tal apuesta) equivale al número de apuestas que representan... y si por tanto su coste es equivalente a las apuestas que representan, si no es así, cuantos más números se apostasen aumentarían las posibilidades (de acierto) en menor cantía económica a las (posibilidades de) reducciones de permutaciones resultantes... pero, inclsuo así, es probable que el coste por apuesta unitaria impida señalar números grandes de apuestas, pués el coste total pueda llegar a ser prohibitivo par ale bolsillo. El número de combinaciones de la bonoloto (para apuestas que exigen 6 combinacones elegibles) es de: 49 * 48 * 47 * 46 * 45 * 44, ahora bien ahí no se filtra las combinaciones que resultan de la misma pero en diferente orden, luego queda dividirla entre 1 * 2 * 3 * 4 * 5 * 6, que supone divir esas más 10 mil millonres 720 veces, lo que siguen dando una cifra elevada pero asequible de 'mantener' a raya. Yo he sido siempre más de quinielas de fútbol... siendo resultado de una 'actividad humana', las estadisticas son más fáctibles de reflejar la realidad de los equipos (siempre que ellos mismos no apuesten y por ello falsifiquen resultados, seguro que te acuerdas que se ha dado más de un caso incluso con detenciones por delitos de este tipo, no solo en España, también en otros países)... De todos modos, lo que a mi me apasiona de este tipo de juegos son las matemáticas tras ellos. Tengo una intuición en la quiniela que aún no me he demostrado (a favor o en contra), que más o menos resumo así: "elegidas 2187 apuestas específicas (no cualesquiera, evidentemente), garantizan siempre un acierto de 14 y varios de 13, amén de los de 12 y 11...". La demostración por exhaustación es inviable en tiempo computacional, así que requiere mucho esfuerzo de cálculo para reducir por combinatoria la búsqueda de tales apuestas (algún día me pondré con ello :silbar: :silbar: :silbar:). Para cualquier interesado en la combinatoria, deben verlo como un sistema que autocontiene o da soporte a una infinitud de bases numéricas con condiciones más o menos 'caprichosas'. Pero que, conocidas tales condiciones uno puede enumerar correlativamente en la base decimal (1,2,3,4,5,6...) para referirse al número enésimo en dicha base numérica caprichosa, vamos como cualquier otra base numérica, y por tanto poder elaborar una fórmula para tomando la enésima combinación requerida (el enésimo número en esa base numérica), obtener el equivalente con los datos que uno pretende que le represente... vamos una abstracción igual que usamos los números para contar monedas, personas, y todo en general. Es justamente la forma en que los algoritmos están representados en este proyecto, donde cada uno (por ser condionantes distintos), mantienen un alfabeto propio, al ser representados por bases numéricas distintas. Un condicionante es la no repetición de elementos, algo deseable a filtrar siempre que sea suficiente mantener un sola copia de dicho elemento, de otro modo el número de permutaciones se dispara... Baste ver la difrencia de combinaciones totales de la bonoloto, 10.068.347.520 frente a las mismas sin repetición: 13.983.816, o dicho de otra manera dada una combinación cualquiera, por ejemplo: 05, 11, 18, 25, 37, 41, se pueden reordenar de 720 maneras distintas, pero de cara a la bonoloto, son la misma apuesta que si alguien decide apostar: 37, 18, 25, 41, 05, 11. Merece la pena crear un fichero con todas esas combinaciones de casi 14millones de apuestas distintas?. La respuesta se autoresponde sola: Solo si uno no sabe luego traducir de la base numérica 13983816 a la combinación específica enumerada, supongamos que la combinación antedicha fuera la 3.100.000ª combinación de esa base numérica, es decir, Código: string = funcion GetCombinacion(entero32 Index) Saludos. Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 13 Mayo 2021, 21:28 pm He generado todas las 13.983.816 combinaciones de la bonoloto y las he comprimido:
https://workupload.com/file/JbvBDXrre3F 1'09Mb. (ojo descomprimido ocupa 273Mb. aprox.) Título: Re: Ejercicio básico de combinaciones Publicado por: luis456 en 14 Mayo 2021, 05:52 am He generado todas las 13.983.816 combinaciones de la bonoloto y las he comprimido: https://workupload.com/file/JbvBDXrre3F 1'09Mb. (ojo descomprimido ocupa 273Mb. aprox.) Gracias Serapis Se me ha complicado la semana y se suponía que hoy me iba a casa, todavía no he probado al 100 % el programa ya que ando con el portátil y es un poco lento ,se me ocurren varias cosas para poder filtrar los resultados (tengo muchos códigos de otros programas sobre lo mismo) ejemplo filtrar tres números iguales (quiero decir a los resultados) y , filtrar primeros tres numeros iguales resultados anteriores , filtrar resultados seguidos ( 1 2 3 4 5 6 ) ( 41 4 2 43 44 45 46 ) y mas cosas .la bonoloto ya tiene años jugando todos los días y ya hay una base de datos con los que se puede hacer varias pruebas .hay que simplemente buscar coincidencias matemáticas ya que esto es un negocio de algunos y todo lo que use un ordenador o pase por un programa este hace lo que el programador dice jejjee .ya que hay resultados que son muy " extraños " yo que te lo digo que tengo desde los dos años (esa es otra historia ) tocando las loterías . Hablamos Luis Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 15 Mayo 2021, 21:26 pm Preguntando a un amigo que suele jugar a la Bonoloto, me señala que el valor de cada apuesta es de 0'50e. y que el máximo de apuestas (por boleto, jugando múltiples apuestas) son 462, jugando 11 números.
Si quisieras conocer las combinaciones, que se apuestan con 11 números, ya deberías tener claro como generar dicha lista con: "ADBCDE" y "FGHIJK" y obtendríamos las 426 combinaciones... donde cada letra representa exclusivamente uno de los 11 numeros jugados (11 letras = 11 números). ------------------------------------------------------------------------------------------------------------------------ ABCDEF ABCDEG ABCDEH ABCDEI ABCDEJ ABCDEK ABCDFG ABCDFH ABCDFI ABCDFJ ABCDFK ... DFGHIJ DFGHIK DFGHJK DFGIJK DFHIJK DGHIJK EFGHIJ EFGHIK EFGHJK EFGIJK EFHIJK EGHIJK FGHIJK Números en apuesta: 11 Total de Combinaciones/apuestas: 462 La teoría de las probabilidades establece igualdad de apariciones para cada combinación y número, sin embargo hay cierto concepto que puede darnos cierta perspectiva... y que paso a señalarte... Si sumamos los valores de todas las combinaciones y la dividimos entre el número de combinaciones totales tendremos la media de la suma de los valores de las combinaciones. La tendencia será siempre hacia ese valor. Dicho de otro modo, es el valor que más veces aparecerá. Como hay casi 14 millones de combinaciones y al final en ellas cada número aparece el mismo número de veces, puede ser resumido y calculado prácticamente a mano de la siguiente manera (luego lo resuminos para hacer el cálculo mentalemnte): 1+2+3+4+5+6 = 21 2+3+4+5+6+7 = 27 3+4+5+6+7+8 = 33 (se calcula como la suma de ambos extremos por 3, ya que la suma 1+6 = 2+5 = 3+4 ... pero también podemos hacerlo más sencillo, pués vemos que cada combinación así formada crece exactamente en 6 respecto de la anterior, que es el resultado de añadir 1 cada valor en la combinación previa (cada vez)...) la sumas finales son: 42+43+44+45+46+47 = 267 43+44+45+46+47+48 = 273 44+45+46+47+48+49 = 279 Dicho de otro modo... se puede finalmente simplicar con un simple bucle tal que así: Código: bucle para k desde 21 hasta 279 en pasos de 6 Y por tanto el valor medio no es otro que el valor equidistante de los extremos, es decir entre 1 y 49 el punto medio es el 25. Si 25 es el punto medio y hay que jugar 6 valores, la suma media pues será: 6*25 = 150. También puede calcularse como ((suma minima + suma maxima)/2) = ((279+21)/2) = 150. Ese valor de 150 se puede calcular de varias formas como se puede ver, y desde la remota cuenta que exigía sumar los valores para los 14millones de combinaciones hasta el bucle y finalmente el cálculo mental, se ha progresado, pero es importanto entenderlo. Si tuvieras almacenado suficientes resultados con la combinación ganadora y se hicera una estadíscia se dibujaría la famosa campana de Gauss, que es el alma de la aleatoriedad y la que refleja, los límites fuera d elos cuales no conviene apostar... Te señalo como dibujarlo: En los horizontales reflejaríamos los valores de suma, comenzando por 21 y acabando por 279, una columna por cada. Entre consecutivos ya ves que el que esté a su derecha, el valor es +6 del previo), y en los verticales se debe dibujar el número de apariciones que ha salido esa suma... es decir pondremos un punto en cada columna x (que representa la suma), a la altura y (que resulta de contar las veces que se ha dado esa suma), finalmente al unir con una línea esos puntos entre sí, tendríamos que el dibujo corresponde a la campana de Gauss. El valor pico, correponderá al 150. Si no es así, puede afirmarse fuera de toda duda que el sistema no es del todo aleatorio, y por tanto habría que procurar que la suma de los valores en tus apuestas (como referencia), sea justamente el que se señalare como el pico en vez del valor 150... Bien, pues si haces tus apuestas mira que la suma de los valores que apuestas, no se alejen mucho de esa cifra (150). Sigas el sistema que sigas, ten siempre esto en cuenta... de hecho si lllegas a trazar la campana, podrías señalar los dos puntos límites (uno a cada lado del pico), tras los cuales desciende drásticamente y por tanto te señalarían los límites adecuados para los que no conviene que tu apuesta sobrepasen. Título: Re: Ejercicio básico de combinaciones Publicado por: FFernandez en 13 Septiembre 2021, 22:32 pm Porque 2 3 5 6 8 9 omites el 22,33 etc
22,23,25,26,28,29 32,33,35,36,38,39 12 números combinados de 6 en 6 sin repetición la combinación numero 1 seria 22,23,25,26,28,29 la última seria 32,33,35,36,38,39 Título: Re: Ejercicio básico de combinaciones Publicado por: Serapis en 14 Septiembre 2021, 22:23 pm No estoy seguro a qué mesnaje respondes exactamente, supongo que a uno de los primeros, donde luis456 señala:
Citar 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 Porque 2 3 5 6 8 9 omites el 22,33 etc No.22,23,25,26,28,29 32,33,35,36,38,39 12 números combinados de 6 en 6 sin repetición la combinación numero 1 seria 22,23,25,26,28,29 la última seria 32,33,35,36,38,39 Luis456 en un proincipio no supo explicar correctamente lo que quería exactamente, más poco a poco fue saliendo a la luz... De hecho más adelante señalaba explícitamente: Citar 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 Cada detalle preciso que quería se fue aclarando al ahondar en el hilo... y fueron totalmente resueltas y satisfechas. |