Page 1 of 1

Tri tarot pour les gens qui s'ennuient

Unread postPosted: 01 Jan 2021, 10:37
by Hayleia
La flemme de réexpliquer après avoir perdu mon post dans une erreur sql quelconque donc je colle juste des trucs qui restent dans mon clipboard :troll:
Si vous connaissez pas le tarot, allez sur wikipedia :troll:

Bon GOG Galaxy met 20 ans à synchroniser mes sauvegardes après que j'aie fait des trucs chelous sur mon ordi donc je rééxplique :troll:
Il y a 4 couleurs, cœurs,trèfles,carreaux,piques (hearts,clubs,diamonds,spades). Chacune a les cartes de 1 à 10, ainsi que les figures (faces) valet,cavalier,reine,roi (jack,knight,queen,king).
En plus de ça il y a les atouts (trumps) de 1 à 21, plus l'excuse qu'on va compter comme l'atout 0.

Bref, ordonner ses cartes d'abord par couleur, et les ordonner de manière croissante à l'intérieur des couleurs est pratique mais ça revient à un tri lexicographique comme disait Bisam hier (donc 0 défi) et ça donne des indications à vos adversaires sur les cartes qu'il vous reste.

Le tri que je propose est
- regrouper par couleur, en triant les couleurs dans l'ordre cœurs, trèfles, carreaux, piques, atouts (ordre arbitraire pour standardiser et valider :P)
- à l'intérieur des couleurs trier les suites dans l'ordre croissant (c'est à dire que la suite 1,2,3,4 est à mettre avant la suite 7,8,9)
- à l'intérieur des suites, trier de manière décroissante (c'est à dire en fait pas 1,2,3,4 mais 4,3,2,1, donc pas 1,2,3,4,7,8,9 mais 4,3,2,1,9,8,7)
- sauf les figures qu'on met toujours dans l'ordre croissant, et sauf excuse et 1 d'atout qu'on met toujours au début des atouts (dans cet ordre) et le 21 à la fin

Exemples rapides :
♥️5 ♥️4 ♥️9 ♥️8 ♠️1 ♠️3 ♠️5
♥️2 ♥️4 ♥️8 ♠️1 ♠️3 ♠️5 (il n'y a pas de suites)

Base de code python.
Code: Select all
from enum import Enum, IntEnum, auto
import random

class Faces(IntEnum):
   Jack = 11
   Knight = auto()
   Queen = auto()
   King = auto()

class Colors(Enum):
   hearts = auto()
   clubs = auto()
   diamonds = auto()
   spades = auto()
   trump = auto()

class Card:
   def __init__(self, color, value):
      self.color = color
      self.value = value

   def __lt__(self, other):
      if self.color != other.color:
         return self.color < other.color
      return self.value < other.value

def deckAsString(deck):
   return '\n'.join([f'{c.color.name}-{c.value.name if isinstance(c.value, Faces) else c.value}' for c in deck])
def printDeck(deck):
   print(deckAsString(deck))

# generate the whole deck
fulldeck = []
for color in Colors:
   if color is Colors.trump:
      # generate from 0 to 21 (0 being excuse)
      for i in range(22): fulldeck.append(Card(color, i))
   else:
      # generate from 1 to 10 and the 4 faces
      for i in range(10): fulldeck.append(Card(color, i+1))
      for face in Faces: fulldeck.append(Card(color, face))

#printDeck(fulldeck)

# pick 24
deck = [c for c in fulldeck]
random.shuffle(deck)
while len(deck) != 24:
   deck.pop()

printDeck(deck)

Re: Tri tarot pour les gens qui s'ennuient

Unread postPosted: 01 Jan 2021, 15:57
by Bisam
Voici ce que j'ai pondu pour trier une couleur. Je te laisse le soin de l'utiliser à bon escient.
Code: Select all
def tri_chelou(couleur):
    triee = sorted(couleur)
    n = len(triee)
    d, f = 0, 1
    c = triee[0] + 1
    while f < n:
        if triee[f] > c:
            triee[d:f] = triee[d:f][::-1]
            d = f
            c = triee[d]
            if c > 10:
                f = n
        f += 1
        c += 1
    return triee

Re: Tri tarot pour les gens qui s'ennuient

Unread postPosted: 01 Jan 2021, 16:03
by Hayleia
Suis en train de faire une usine d'un autre genre de mon côté :troll:
Probablement pas très pythonesque mais ça me va.

(Et sinon j'ai corrigé la génération de paquet de 24 cartes qui pouvait sortir des cartes en double -.-)

Re: Tri tarot pour les gens qui s'ennuient

Unread postPosted: 02 Jan 2021, 10:58
by Hayleia
Bon mon usine honteuse fonctionne mais je partage pas parce qu'elle est ridicule :troll:

Sinon pour le tri de Bisam, il suffit presque de rajouter ça.
Code: Select all
def BisamSortDeck(deck):
   ret = []
   for color in Colors:
      ret += [Card(color, v) for v in tri_chelou([c.value for c in deck if c.color == color])]
   return ret


"Presque" parce que du coup
- ça ne met pas les atouts 0 et 1 au début, et 21 à la fin
- ça arrête de trier les atouts "dans l'ordre décroissant si nécessaire) à partir de 10

Mais bon, c'est pas compliqué à changer vite fait :P

Re: Tri tarot pour les gens qui s'ennuient

Unread postPosted: 02 Jan 2021, 11:22
by Bisam
Voici la version 2.0 . Attention, j'ai changé les paramètres.
Code: Select all
def tri_chelou(hauteurs, couleur):
    """Renvoie une liste de valeurs dans l'ordre 'Hayleia'.
    hauteurs est la liste des numéros des cartes,
    couleur est le nom de la couleur"""
   
    triee = sorted(hauteurs) # on fait un premier tri dans l'ordre croissant
   
    if couleur is Colors.trump:
        pre = [i for i in triee if i<2] # On met à part excuse et petit
        post = [i for i in triee if i>20] # et 21
        triee = [i for i in triee if 1<i<21] # on ne garde que le reste
    else:
        pre = []
        post = [i for i in triee if i>10] # on met à part les figures
        triee = [i for i in triee if i<11] # on ne garde que le reste
   
    n = len(triee)
    d, f = 0, 1
    c = triee[0] + 1
    while f < n:
        if triee[f] > c:
            triee[d:f] = triee[d:f][::-1]
            d = f
            c = triee[d]
        f += 1
        c += 1
   
    return pre + triee + post