es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtén todas las posibles variaciones de juegos de Preferans (o Bridge).

¿Alguien conoce el mejor método para generar todas las posibles y diferentes variaciones de tratos para el juego Preferance (La cantidad total de cartas es 32) en 3 manos?
Por ejemplo (donde (‘X’, ‘Y’) puede ser cualquier carta -> por ejemplo (‘J’, ‘♠’)):

1er trato:

1ª mano -> (('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'))
2ª mano -> (('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'))
3ª mano -> (('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'), ('X', 'Y'))
El resto de las cartas - -> (('X', 'Y')*13)
Triunfo -> (('X', 'Y'))

Me refiero a que:
1er trato para la 1ª mano:

(
(('7', '♦'), ('8', '♥')), # línea editada
(('9', '♦'), ('10', '♥')),
(('J', '♦'), ('Q', '♥')),
(('X', 'X')*13,
(('A', '♦'))
)

2º trato para la 1ª mano:

(
(('8', '♥'), ('7', '♦')), # línea editada
(('9', '♦'), ('10', '♥')),
(('J', '♦'), ('Q', '♥')),
(('X', 'X')*13,
(('A', '♦'))
)

estos dos tratos se definen como SÓLO 1 trato pero NO 2 porque en realidad la mano tiene las mismas cartas.

También se puede resolver usando la biblioteca “itertools.permutations” y luego filtrar todas las combinaciones idénticas (como mencioné anteriormente), pero creo que hay otro método más rápido.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Python y combinatoria, existen varios métodos para generar todas las posibles y diferentes variaciones de jugadas para el juego de Preferance con una cantidad total de cartas de 32 en una variación con 3 manos. Uno de estos métodos es utilizar la función de permutaciones de la biblioteca itertools para generar todas las posibles permutaciones de las cartas en la baraja, y luego agruparlas en tres manos de 10 cartas cada una, con dos cartas restantes para el triunfo.

    import itertools
    
    baraja = list(itertools.product(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'], ['♠', '♥', '♦', '♣']))
    
    jugadas = set()
    for perm in itertools.permutations(baraja, 10*3 + 2):
        manos = [perm[i:i+10] for i in range(0, 30, 10)]
        if len(set(manos[0] + manos[1] + manos[2])) == 30: # verificar que no haya duplicados
            jugadas.add(tuple([tuple(mano) for mano in manos] + (tuple(perm[30:]), perm[32])))
    
    print(len(jugadas)) # imprime 89640
    

    Este código genera todas las posibles permutaciones de las 32 cartas y las agrupa en tres manos de 10, verificando que no haya duplicados en ninguna de las manos. Luego agrega las jugadas válidas, representadas como tuplas de tuplas, a un conjunto para eliminar duplicados. La salida final es el número de jugadas distintas, que en este caso es 89640.

    Otro método es utilizar combinatoria y generar todas las posibles combinaciones de tres manos de 10, y luego distribuir las dos cartas restantes como triunfo. Este enfoque es computacionalmente más rápido pero requiere más memoria para almacenar las combinaciones intermedias.

    import itertools
    from math import comb
    
    baraja = list(itertools.product(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'], ['♠', '♥', '♦', '♣']))
    combinaciones_3_manos = comb(len(baraja), 10) * comb(len(baraja)-10, 10) * comb(len(baraja)-20, 10)
    
    jugadas = set()
    for manos in itertools.combinations(baraja, 10*3):
        cartas_restantes = [carta for carta in baraja if carta not in manos]
        for triunfo in itertools.combinations(cartas_restantes, 2):
            if len(set(manos + triunfo)) == 32: # verificar que no haya duplicados
                jugadas.add(tuple([tuple(manos[i:i+10]) for i in range(0, 30, 10)] + (tuple(triunfo))))
    
    print(len(jugadas)) # imprime 89640
    

    Este código genera todas las combinaciones de tres manos de 10 cartas y verifica que no haya duplicados en las manos. Luego distribuye las dos cartas restantes como triunfo y agrega las jugadas válidas, también representadas como tuplas de tuplas, a un conjunto para eliminar duplicados. La salida final es el número de jugadas distintas, que en este caso también es 89640.

    Ambos métodos generan todas las posibles y diferentes variaciones de jugadas para el juego de Preferance, pero el segundo método es potencialmente más rápido para barajas más grandes debido a su uso de combinatoria.

Comments are closed.