http://dle.rae.es/?id=FznyqUREstá todo allí, bastante claro, si te tomas la molestia de leerlo... entresaco un par de párrafos que inicialmente resumen bastante.En el primer pedazo de código se definen funcionalidad previa, enumeraciones y tal, como se indica aquí:
...
- Luego hay 4 constructores de clase, para permitir invocar el tipo de alfabeto de que se quiere generar en base a las opciones que permite. (para ! X " habría que elegir Custom, y pasar la cadena ("1X2")
- Finalmente hay un método que construye el alfabeto.
La idea de esta clase, es que el alfabeto sea definido una sola vez y pueda ser usada como parámetro para enumerar. Así se evita que mientras se enumere se modifique el alfabeto (o el tamaño del mismo) y dé lugar a errores durante la ejecución. Ya que se construye y luego es de solo lectura, no puede modificarse mientras se usa.
El siguiente código, copiado de allí:
El bucle interno que realiza toda la operatoria, para generar una permutación y el bucle externo para iterar entre ttodas las permutaciones.
Do
v = k
n = Numchars
Do
x = (v Mod p_Sizealfabeto)
Clave(n) = p_Alfabeto(x) ' convertir el byte a char.
v \= p_Sizealfabeto ' división entera.
n -= 2
Loop While (n >= 0)
' USAR la clave desde aquí
' llamada a FuncionX(Clave)
k += 1
Loop While (k < s_MaxPermutaciones)
Equilicuá... si ya has visitado el enlace para saber lo que significa, tu pregunta sobra...
Justo las líneas antes del bucle, señalé esto:
If (.PermutacionInicialLng < 0) Then .PermutacionInicialLng = 0
If (.PermutacionInicialStr.Length > 0) Then
' FALTA: código para convertir la clave a la enésima permutación.
' es el proceso inverso al seguido en el algoritmo y debiera facilitarse como una función pública.
' k= EnesimaPermutacion(.PermutacionStr) ' La función que devolvería el índice de la permutación reclamada.
Else
k = .PermutacionInicialLng
End If
Convertir una clave-apuesta (permutación) a un número indexado de permutación dentro de todas las permutaciones, es (como señalo en dicho texto) la operación inversa...
Resulta tan obvio, que ni me molesté en hacerlo. En general con ese algoritmo (el primero de 4), la única forma de parar en una permutación específica para poder continuar desde donde se dejó en otro momento, exije precisamente convertir una permutación a su valor numérico (el enésimo en la permutación, justamente para luego sumar 1 y seguir generando permutaciones partiendo de ese valor)...
Más arriba al comentar sobre ese algoritmo, describiía que
es el más sencillo, pero también el más lento de los 4. Todas las permutaciones de la quiniela (3^14= 4'7millones), en éste equipo desde el que escribo, que data del 2008, las genera en 3'99 segundos, en tanto los otros algoritmos, los generan 2-3 órdenes más rápidos (cientos-miles de veces más rápido)... no se requieren multiplicaciones, divisiones, módulo... solo suma 1 para un único carácter (de toda la palabra) para generar la siguiente permutación. En los otros no puedo computar el tiempo exacto, siempre da 0 TICKS (frente a los casi 40millones de ticks).
En definitiva, lo que te decía al principio es que esto es pura combinatoria, tratarlo como algo distinto, aleja el sentido matemático de un problema conocido, hacia algo que pueda parecer 'raro'...
generar claves = generar las apuestas de la quiniela. Es lo mismo, solo cambia el alfabeto usado ("1X2", para la quiniela) y el tamaño de 'palabras' a generar (para la quiniela una palabra de 14 caracteres).
Cambiando el nombre porque el dominio social sea diferente, no lo convierte en ningún problema nuevo ni distinto, de ahí que cuando señalaste que no habías encontrado 'fuentes', sin estar errado, no llega a ser cierto... es solo porque has buscado por un nombre específico, en vez del genérico del problema.
Si quieres hacer algo interesante sobre las quinielas (y de lo que no hay apenas literatura), te comento por ejemplo que intentes lograr cuántas y cuáles permutaciones para 4 partidos, son las mínimas necesarias
para asegurar siempre que se aciertan al menos 3 (de los 4 partidos). Es decir que jugando x apuestas para 4 partidos, tengas asegurado (al menos) 3 aciertos... y cuáles son, o mejor dicho, como obtener las combinaciones de dichas apuestas... teniendo en cuanta que todas las permutaciones posibles para esas 4partidos, son al menos 3 triples (27 apuestas) y un partido fijo en las 27 apuestas, que lógicamente son costosas (los triples), ¿...se puede asegurar 3 aciertos con menos apuestas que las 27?...
Esto es algo conocido, aunque te comento que existen muchas combinaciones (y curiosamente la ONLAE, solo contempla 1), más aún esto se puede ampliar a 5, 6, 7, etc... partidos, que lo hace todavía más interesante...
Saludos.
El uso que le has dado para generar claves me perece excelente y sinceramente a mi no se me había ocurrido, de hecho de haberseme ocurrido hubiera expandido más la idea en sí. Así que chapó por tí muy buena idea y buen trabajo. me parece admirable.
Eso que dices que genera todas las variaciones de la quiniela en 3,99 segundos me recuerda a una discusión que tuve una vez con @Elektro no recuerdo de qué en la que él afirmaba que un determinado proceso ( que no recuerdo) lo hacía en pocos segundos mientras que a mí me tardaba minutos. La conclusión que yo llegué era a que era un tema de CPU, de medios informáticos, de hardware y no del código en sí. Aunque al final creo recordar no llegamos a un acuerdo.
Si quieres hacer algo interesante sobre las quinielas (y de lo que no hay apenas literatura), te comento por ejemplo que intentes lograr cuántas y cuáles permutaciones para 4 partidos, son las mínimas necesarias para asegurar siempre que se aciertan al menos 3 (de los 4 partidos). Es decir que jugando x apuestas para 4 partidos, tengas asegurado (al menos) 3 aciertos... y cuáles son, o mejor dicho, como obtener las combinaciones de dichas apuestas... teniendo en cuanta que todas las permutaciones posibles para esas 4partidos, son al menos 3 triples (27 apuestas) y un partido fijo en las 27 apuestas, que lógicamente son costosas (los triples), ¿...se puede asegurar 3 aciertos con menos apuestas que las 27?...
Esto es algo conocido, aunque te comento que existen muchas combinaciones (y curiosamente la ONLAE, solo contempla 1), más aún esto se puede ampliar a 5, 6, 7, etc... partidos, que lo hace todavía más interesante...
Saludos.
Sí, ya desarrollé varios programas, de hecho estoy re-codificando y mejorando el último que está basado en un sistema propio el cual trata de garantizar y optimizar el acierto.
Me gustaría aclarar una cosa ya que con esto de variaciones, permutaciones y combianciones hay un poco lío. En la rama de las Matemáticas, la combinatoria, hay una especificación para cada caso.
VARIACIONES son las formas de ordenar un grupo de elementos que pueden ser con repetición o sin repetición tomados de n en n. Ejemplo:
Sin repetición:
Elementos: A, B, C
Tomados de dos en dos
AC, AB, BC.
Con repeticion
Elementos: A, B, C
de tres en tres
AAA, AAB, AAC, BBB, CCC,...
Tomados de 4 en 4
AAAB, ABBB, AAAC, ....
PERMUTACIONES son variaciones en las que entran en cada grupo
TODOS los elementos considerados.
A, B, C, D
ABCD
ABDC
ACBD
ACDB
ADBC
ADCB
BACD
BADC
BCAD
BCDA
BDAC
BDCA
CABD
CADB
CBAD
CBDA
CDAB
CDBA
DABC
DACB
DBAC
DBCA
DCAB
DCBA
24 Permutaciones
Las permutaciones con repetición son aquellas en los que están establecidos determinados elementos para permutarlos y que se repiten:
Elementos: 2,2,2,4,4
Entonces sería todas las formas de permutar estos elementos de los cuales hay repetidos, pero que están condicionados el número de repeticiones, en este caso el dos, tres veces y el cuatro, dos veces.
Y por último las
COMBINACIONES. En este caso son aquellas
combinaciones en las que se diferencian cada grupo cogidos de n en n, por ejemplo.
A, B, C, D de 3 en 3:
ABC, ABD, ACD
pero no entraría CBA o BCA porque ya que se entiende estaría dentro del grupo ABC.
Igualmente hay con Combinaciones sin repetición y con repetición.
Esto lo aclaro porque en el caso de La Quiniela hablamos de VARIACIONES (con repetición) no permutaciones. Y si me equivoco corregidme el/la que sea.
Dicho lo anterior también aclarar que mi post está enfocado como "una curiosidad" (como especifico claramente si se lee) sobre el juego de La Quiniela en concreto y expongo ejemplo a modo de programación para aquellos quinialistas que sepan programar y deseen comprobarlo o usarlo en algún proyecto si cabe.
Estoy deseando estudiar tus códigos y cuando lo haga ya comentaré algo al respecto.
Maldita sea, ya no tengo tanto tiempo como antes, a ver un día de estos o el fin de semana.
Saludos