Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 08/11/2007, à 01:14

AuraHxC

Re : [OCAML] trier des cartes

Salut !!!
Je pense que tout ce que vous m'avez proposé est intéressant et donc je testais wink
Sinon je peux vous donner mon code qui pour l'instant ne fonctionne pas (enfin pour le tri).
Mon code comprend une fonction qui regarde si il y a 4 as dans le paquet, une fonction relation entre les cartes, insertion (qui ne va pas trop je crois) et tri qui utilise insert.

type couleur = Coeur | Carreau | Pique | Trefle
;;

type carte = As of couleur
         | Roi of couleur
         | Dame of couleur
         | Valet of couleur
         | Basse of int*couleur
;;

type paquet_de_carte = Derniere of carte
		       | Dessus of carte*paquet_de_carte
;;

let isAs c = match c with
   As _  -> true
  | _    -> false
;;

let rec compteAs p = match p with
     Derniere(c)  -> if isAs c then 1 else 0
   | Dessus(c, p) -> if isAs c then 1+(compteAs p)
     else  (compteAs p)
;;

let quatreAs p = (compteAs p = 4)
;;

let jeu = Dessus(As(Coeur),Dessus(Roi(Trefle),Derniere(Basse(10,Carreau))));;
let jeu2 = Dessus(Roi(Carreau),Dessus(As(Trefle),Dessus(Basse(9,Coeur),Dessus(As(Pique),Dessus(As(Coeur),Dessus(Valet(Pique),Dessus(As(Carreau),Derniere(Basse(3,Pique)))))))));;

let getCouleur carte = match carte with
    As c -> c
  | Roi c -> c
  | Dame c -> c
  | Valet c -> c
  | Basse(x,c) -> c
;;
    
let relation c1 c2 = match (getCouleur c1) with
    Coeur -> true
  | Carreau -> if (getCouleur c2) = Coeur then false else true
  | Pique -> if (((getCouleur c2) = Coeur) or ((getCouleur c2) = Carreau)) then false else true
  | Trefle -> false
;;

let rec insert carte paquet = match paquet with
    Derniere c -> if (relation carte c) then Dessus(carte,Derniere c)
                     else Dessus(c,Derniere carte)
  | Dessus(c,p) -> if (relation carte c) then Dessus(carte,Dessus(c,p))
                     else Dessus(c,Dessus(carte,p))
;;

let rec tri paquet = match paquet with
    Derniere c -> Derniere c
  | Dessus(c,p) -> insert c (tri p)
;;

Voilà wink

Hors ligne

#27 Le 08/11/2007, à 02:42

best_friend_fr

Re : [OCAML] trier des cartes

Salut,

Ca ne marche pas seulement parce que tu as oublie la recursion dans le insert.

Sinon, tu as des formules plus "CaML" pour certaines tournures

let rec compteAs p = match p with
     Derniere(c)  -> if isAs c then 1 else 0
   | Dessus(c, p) -> if isAs c then 1+(compteAs p)
     else  (compteAs p)
;;

se fait plutot

let rec compteAs = function
Derniere (As c) -> 1
| Derniere _ -> 0
| Dessus (As _, p) -> 1 + (compteAs p)
| Dessus (_,p) -> compteAs p
;;

Apres, tu n'es pas oblige. Et je ne sais pas si tu connais la tournure avec un when

| Truc (a) -> if (a=b) then c else d

devient

| Truc (a) when a=b ->c
| Truc (a) -> d

sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#28 Le 08/11/2007, à 12:18

AuraHxC

Re : [OCAML] trier des cartes

En fait, je connais la syntaxe que tu proposes mais là j'apprends la programmation fonctionnelle avec Ocaml et donc je fais exactement comme le prof nous l'apprend wink
Bon j'ai plus qu'a me replonger dans mon problème.

Hors ligne

#29 Le 08/11/2007, à 13:36

AuraHxC

Re : [OCAML] trier des cartes

Bon ben ca à l'air de fonctionner effectivement comme un âne j'ai oublié la récusivité... faudrait que je dorme plus parfois lol

(*Données pour jeu de carte*)

type couleur = Coeur | Carreau | Pique | Trefle
;;

type carte = As of couleur
         | Roi of couleur
         | Dame of couleur
         | Valet of couleur
         | Basse of int*couleur
;;

type paquet_de_carte = Derniere of carte
		       | Dessus of carte*paquet_de_carte
;;

let jeu = Dessus(As(Coeur),Dessus(Roi(Trefle),Derniere(Basse(10,Carreau))));;
let jeu2 = Dessus(Roi(Carreau),Dessus(As(Trefle),Dessus(Basse(9,Coeur),Dessus(As(Pique),Dessus(As(Coeur),Dessus(Valet(Pique),Dessus(As(Carreau),Derniere(Basse(3,Pique)))))))));;

(*Fonctions pour manipuler un jeu de carte *)

let isAs c = match c with
   As _  -> true
  | _    -> false
;;

let rec compteAs p = match p with
     Derniere(c)  -> if isAs c then 1 else 0
   | Dessus(c, p) -> if isAs c then 1+(compteAs p)
     else  (compteAs p)
;;

let quatreAs p = (compteAs p = 4)
;;

let getCouleur carte = match carte with
    As c -> c
  | Roi c -> c
  | Dame c -> c
  | Valet c -> c
  | Basse(x,c) -> c
;;
    
let relation c1 c2 = match (getCouleur c1) with
    Coeur -> true
  | Carreau -> if (getCouleur c2) = Coeur then false else true
  | Pique -> if (((getCouleur c2) = Coeur) or ((getCouleur c2) = Carreau)) then false else true
  | Trefle -> false
;;

let rec insert carte paquet = match paquet with
    Derniere(c)	-> if relation carte c then Dessus(carte, Derniere c)
				else Dessus(c, Derniere carte)
  | Dessus(c,p) -> if(relation carte c) then Dessus(carte, Dessus(c,p))
    else Dessus(c,(insert carte p))
;;

let rec tri paquet = match paquet with
    Derniere c -> Derniere c
  | Dessus(c,p) -> insert c (tri p)
;;

tri jeu2;;

Résultat sur jeu2 :

#   - : paquet_de_carte =
Dessus (Basse (9, Coeur),
 Dessus (As Coeur,
  Dessus (Roi Carreau,
   Dessus (As Carreau,
    Dessus (As Pique,
     Dessus (Valet Pique, Dessus (Basse (3, Pique), Derniere (As Trefle))))))))

Voilà, voilà je vais continuer dans ma lancer et faire d'autre truc wink
Merci pour votre aide précieuse wink

Hors ligne

#30 Le 08/11/2007, à 17:34

AuraHxC

Re : [OCAML] trier des cartes

j'ai modifié ma fonction relation car je viens d'apprendre que dans les types énumérés il y a un ordre automatiquement induit entre les valeurs du type (comme pour le C).
Donc ma fonction devient simplement :

let relation c1 c2 = (getCouleur c1) <= (getCouleur c2)
;;

Voilà voilà wink

Hors ligne