Bonjour à tous ,
Je lance cette discussion car j'aurais besoin d'aide pour réaliser une operation en OCAML.
Je vais tout d'abord vous expliquer le problème pour vous mettre dans le contexte.
J'ai un fichier à lire avec des déclarations de fonctions du style : abc=(d,f) ou ab=() ou encore abg=(dsa) etc.
Une fonction est sur une ligne.
Et donc je dois trouver pour une certaine liste de fonctions si cette liste est correcte ou pas vis a vis des declarations. Par exemple :
est correcte car toutes les variables sont définies
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 abc=f(a,b) a=() b=()
Cependant si on a :
ceci est faux car b n'est pas définie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 abc=f(a,b) a=()
et dernierement si on a :
cela est egalement faux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 a=f(b) b=f(a)
Pour coder ceci j'ai choisis de créer trois listes : une avec les fonctions qui sont bien déclarés (fb), une autre avec le couple (nom_fonctions,[liste_vars]) où on mets les fonctions qui ne sont pas encore bien définies car ces variables ne sont pas définies (fa) et une derniere pour les variables qui ne sont pas encore définis (va).
Donc dans ma logique j'ai fais ainsi :
On lis une fonction ainsi : nom_fonct=x([liste_vars]) (Ici on n'a pas besoin de x)
- Si nom_fonct=(), on ajoute nom_fonct directement a la liste fb
- Si touts les elements de [liste_vars] sont dans fb alors mettre nom_fonct dans fb
- Si un ou plusieurs elements de [liste_vars] ne sont pas dans fb alors on ajoute [liste_vars] dans va, mais ne faisant un test pour savoir si certaines de ces variables y sont deja pour ne pas en avoir en 2 fois. Et par la suite ajouter dans la liste fa (nom_fonct,[liste_vars]
- Apres avoir lu chaque fonction de la liste, faire une operation qui permet de comparer les deux listes et voir si il n'y a pas des elements dans fb qui sont dans va et ainsi le supprimer dans va, et faire la meme opération dans la liste fa pour les variables des couples et au fur et à mesure vider les deux liste fa et va et remplir celle de fb.
- Finalement, apres avoir lu toute la liste des fonctions, si la liste va n'est pas vide alors cette sequence de fonctions n'est pas bonne, sinon elle est bonne.
J'ai commence a coder ceci mais je suis bloqué au niveau de l'ajout dans les liste fa et va avec le non-rajout de deux fois le meme élément
Je vous mets mon code ci-dessous :
C'est seulement après avoir trouvé une seule variable qui n'est pas dans fb qu'on fais l'ajout aux différentes listes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 let rec supprime l a = match l with []-> [] |x::r when x = a -> List.tl l |x::r -> supprime r a;; let rec ajoutefin a l = match l with [] -> [a] |x::r -> x::ajoutefin a r;; let rec jamLoop n fich i lb la va = let indiceEgal s = String.index s '=' in let indice1Par s = String.index s '(' in let ssv s j = String.sub s j+1 ((String.length s)-j-2) in (*Sortie du string des variables*) let ssn s i = String.sub s 0 i in (*Sortie du nom de la fonction en string*) let listVar s = if String.contains s ',' then Str.split (Str.regexp ",") s else Str.split (Str.regexp "") s i (*Si les variables comportent des virgules, les separer avec la virgule comme séparateur sinon juste mettre le string sous forme d'un element de la liste*) let lecVarDir s fb = match s with s when String.sub s (String.length s - 3) 3 = "=()" -> ajoutefin (String.sub s 0 (String.length s - 3)) fb (*Direct mettre dans FB si aucune variable*) |_ -> s in let ligne = input_line fich in let rec verifVar fb l fa va s = match l with [] -> ajoutefin s fb |x::r when List.mem x fb -> verifVar fb l fa va s (*Si variable dans la liste fb faire appelle reecursif et verifie autres elements de la liste*) |_ -> let rec ajoutDiffLis fa va l s = match l with (*Ajout dans les differentes listes*) x::r when List.mem x va -> ajoutDiffLis fa va r s (*Vérifie si une variable est dans la liste des fb si oui il fait le test avec touts les autres variables*) |x::r -> ajoutefin x va;ajoutefin () (*C'est ici qu'il faut vérifier si les variables sont deja dans la liste VA si oui on passe à la prochaine sinon on ajoute dans la liste et à la fin il faut ajouter le couple (fonct,[vars]) dans la liste FA*) if i = n then if la = [] then "GOOD" else "BAD" else jamLoop n fich (i+1) lb la;; let jamEval a = let fb = [] in let fa = [] in let va = [] in let fich = open_in "C-small-practice.in" in let n = int_of_string (input_line fich) in jamLoop n fich 0 fb fa va;;
J'espère que vous comprenez le problème que je rencontre. Sinon je vous mets le liens du problème en question : https://code.google.com/codejam/cont...dashboard#s=p2
Merci d'avance.
Cordialement
Rigaux
Partager