IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Ou est l'erreur?


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut Ou est l'erreur?
    Bonjour , voila mon code qui a pour but:

    anagramme "bla bla" "lala bb";;
    renverrait true meme si c'est pas vraiment un anagramme.

    Voila mon code
    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
     
    let annagramme ch1 ch2=
    let long1=string_length ch1 
    in let long2=string_length ch2
    in if long1=long2 then let rec parcourir ch1 ch2=
         let long=string_length ch1
         in if long>0 then let rec appartient c ch=
    	let long=string_length ch
            in if long>0 then if (c=nth_char ch 0) then 1
    				else 1+appartient c (sub_string ch 1 (long-1))
    			else (long+1)
    	in let pos=appartient  (nth_char ch1 0) ch2
    	    in if (pos-1)<long then parcourir (sub_string ch1 1 (long-1)) ((sub_string ch2 0 (pos-1))^(sub_string ch2 pos (long-pos)))												                                        else false
    			else true
    else false;;
    La fonction parcourir est bonne je l'ai teste toute seule cependant le compilateur refuse mon dernier else avec syntax error.Pourtant je n'ai pas de probleme de typage , enfin je crois pas .Du coup ,et ben je sais pas ou est l'erreur.Merci de m'aiguiller.Désolé pour la "forme" du code mais j'arrive pas à faire mieux...

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    code mal indenté... illisible dans le forum ^^


    mon code qui a pour but:

    anagramme "bla bla" "lala bb";;
    renverrait true meme si c'est pas vraiment un anagramme.
    ben vu la précision de l'objectif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    let annagramme ch1 ch2 = true
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    En espérant que le code soit plus lisible maintenant.

    Pour le but , et bien il s'agit de renvoyer vrai si ch2 est un annagramme de ch1 et faux sinon(mais on prends en compte les espaces).

  4. #4
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Citation Envoyé par Freedom57
    En espérant que le code soit plus lisible maintenant.
    Nul espoir, ce code est imbuvable, bien indenté ou non. Il y a vraiment beaucoup de choses à améliorer, notamment ces deux-là :

    • Tu utilises massivement sub_string, ce qui est très inefficace. Songe à utiliser des index plutôt que des sous-chaînes.
    • L'abus des conditions if...then...else réduit d'un coup la lisibilité du programme.

    À ta place, je retournerai gribouiller sur mon brouillon avant de coder quoi que ce soit. Tu verras qu'on peut résoudre ton problème de façon beaucoup plus élégante. Une solution très naïve mais qui m'amuse beaucoup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let apply tbl f chr = f tbl.(int_of_char chr)
    
    let anagramme x y =
      let tbl = Array.init 256 (fun _ -> ref 0) in
      List.iter2 (fun f -> String.iter (apply tbl f)) [incr; decr] [x; y]; 
      Array.fold_left (fun b r -> b && !r = 0) true tbl
    Avec la fonction anagramme définie ci-dessus, la chaîne de caractères "alcofribas nasier" est bien reconnue comme une anagramme de la chaîne de caractères "francois rabelais" (inutile de rappeler la réalité historique de cet exemple).

    Citation Envoyé par gorgonite Voir le message
    ben vu la précision de l'objectif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    let annagramme ch1 ch2 = true



    Cordialement,
    Cacophrène

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    J'avais en tête de procéder comme tu le proposes Cacophrene, mais je n'aurais même pas espéré atteindre un tel niveau de magnificence !!! C'est de telle beauté ! Bravo ! Bravo !
    -- Yankel Scialom

  6. #6
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Une solution très naïve mais qui m'amuse beaucoup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    let to_sorted_array s =
      let a = Array.init (String.length s) (fun i -> s.[i]) in
      Array.sort compare a;
      a
     
    let anagramme x y = to_sorted_array x = to_sorted_array y

  7. #7
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir le forum,

    Citation Envoyé par prgasp77
    J'avais en tête de procéder comme tu le proposes Cacophrene, mais je n'aurais même pas espéré atteindre un tel niveau de magnificence !!! C'est de telle beauté ! Bravo ! Bravo !
    C'est gentil mais... faudrait quand même pas exagérer.
    Je préfère la solution donnée par LLB car céplucourt sauf si les mots à comparer sont très longs (elle serait alors moins performante, en temps et en mémoire, par exemple avec quelque chose comme String.create 1000000 comme mot).

    Si mes (lointains) souvenirs d'algorithmique sont exacts la version de LLB est en O(n log n) avec n la longueur des mots à comparer (c'est la complexité en temps du merge sort utilisé par Array.sort), tandis que la mienne est en O(n). Dans les deux cas, cependant, on est loin de la version du PO.

    Cordialement,
    Cacophrène

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    À ta place, je retournerai gribouiller sur mon brouillon avant de coder quoi que ce soit.
    J'en prend note.

    Je ne sais pas encore utiliser les tableaux , donc pour l'instant je dois faire sans.

    Songe à utiliser des index plutôt que des sous-chaînes.
    Qu'est ce que tu endends par index?Si tu peux me donner un exemple(voir si je sais de quoi il s'agit ou pas...)

    Merci pour vos remarques.

  9. #9
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Citation Envoyé par Freedom57 Voir le message
    Je ne sais pas encore utiliser les tableaux , donc pour l'instant je dois faire sans
    Il n'y a que deux fonctions à comprendre, tu devrais t'en sortir.
    Mais sinon, la même avec une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let to_sorted_list s =
      let res = ref [] in
      for i = String.length s - 1 downto 0 do res := s.[i] :: !res done;
      List.sort !res
     
    let anagramme x y = to_sorted_list x = to_sorted_list y
    Citation Envoyé par Freedom57 Voir le message
    Qu'est ce que tu endends par index?Si tu peux me donner un exemple(voir si je sais de quoi il s'agit ou pas...)
    Utiliser des entiers pour indiquer la position dans la chaine, plutôt que de calculer des sous-chaines.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 928
    Points
    928
    Par défaut
    Citation Envoyé par Cacophrene Voir le message
    Une solution très naïve mais qui m'amuse beaucoup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let apply tbl f chr = f tbl.(int_of_char chr)
    
    let anagramme x y =
      let tbl = Array.init 256 (fun _ -> ref 0) in
      List.iter2 (fun f -> String.iter (apply tbl f)) [incr; decr] [x; y]; 
      Array.fold_left (fun b r -> b && !r = 0) true tbl
    Tu ferais pas un poil trop de Haskell toi ? Je sais ce que fais ce code, puisque j'ai eu la même idée. Mais même en le lisant plusieurs fois, je ne le comprends pas. Et puis le tableau de référence sur des entiers, tu m'excuseras, mais quoi. Surtout pour répondre à quelqu'un qui est clairement un débutant !

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    L'astuce dans ce code c'est l'utilisation de `incr` sur x et `decr` sur y, rendue courte par le List.iter2. Ensuite la condition de correction est "la somme des incr et decr donne 0".

    S'il utilise des références, c'est parce que "incr" et "decr" font directement ce qu'il veut, plus simplement que (fun t i -> t.(i) <- t.(i) + 1).

    Pour ma part (mais je l'ai déjà mentionné), je milite pour le découplage des facilités d'accès arbitraire et de mutation, c'est-à-dire pour un modèle où les tableaux sont immutables par défaut, et où on utilise des références pour la mutabilité; contrairement aux cases du tableau, elles sont first-class.

    Une version compréhensible.utilisant le même algorithme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let occurences t =
        let occ = Array.make 256 0 in
        String.iter (fun c -> let n = Char.code c in occ.(n) <- occ.(n) + 1) t;
        occ
     
    let anagramme x y = (occurences x = occurences y)
    La solution Array.Set de LLB (ou équivalent avec Set.Make) a l'avantage de bien passer à des character set beaucoup plus larges, comme Unicode.
    Par ailleurs, la bibliothèque Camomile (unicode pour caml) propose ses propres structures de donnée optimisées UMap et USet.

  12. #12
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    Citation Envoyé par TropMDR
    Tu ferais pas un poil trop de Haskell toi ? Je sais ce que fais ce code, puisque j'ai eu la même idée. Mais même en le lisant plusieurs fois, je ne le comprends pas. Et puis le tableau de référence sur des entiers, tu m'excuseras, mais quoi. Surtout pour répondre à quelqu'un qui est clairement un débutant !
    Pour ta gouverne, je n'ai jamais codé une ligne de Haskell. Quant à mon code, je me permets de ne pas le trouver plus obscur que la montagne de conditions et de fonctions récursives imbriquées du PO... De plus j'ai aussi donné au PO des indications en français pour améliorer son code. Bref, ton message est à côté de la plaque.

    Cordialement,
    Cacophrène

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 928
    Points
    928
    Par défaut
    Citation Envoyé par Cacophrene Voir le message
    Bref, ton message est à côté de la plaque.
    Reprenons donc plus en détail ce que je veux dire par là.
    On a deux codes, l'un de bluestorm, l'autre de toi, se reposant sur la même idée. (oui, chronologiquement, c'est dans l'autre sens).

    Celui de bluestorm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let occurences t =
        let occ = Array.make 256 0 in
        String.iter (fun c -> let n = Char.code c in occ.(n) <- occ.(n) + 1) t;
        occ
     
    let anagramme x y = (occurences x = occurences y)
    Décortiquons le pour voir :
    On défini une fonction occurences. La variable n'exprime malheureusement pas son type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        let occ = Array.make 256 0 in
    qui commence par définir un tableau (en anticipant, on peut même voir que c'est ce tableau qui sera retourné par la fonction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        String.iter (fun c -> let n = Char.code c in occ.(n) <- occ.(n) + 1) t;
    String.iter ... t ==> t est une chaine, et on exécute une fonction sur chacun de ses caractères
    (fun c -> let n = Char.code c in occ.(n) <- occ.(n) + 1) ==> la fonction récupère le code ascii du caractère et incrémente la case correspondante du tableau
    On retourne le tableau

    Résumé de la fonction occurences : pour chaque caractères de la chaine, on incrémente la case correspondante du tableau. Donc à la fin, le tableau contient à la case i le nombre d'occurrence du caractère i dans la chaine initiale

    Et finalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let anagramme x y = (occurences x = occurences y)
    x et y sont anagramme l'un de l'autre si le nombre d'occurrence de chaque caractère est le même dans les deux chaines


    Maintenant, passons au code de Cacophrene
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let apply tbl f chr = f tbl.(int_of_char chr)
     
    let anagramme x y =
      let tbl = Array.init 256 (fun _ -> ref 0) in
      List.iter2 (fun f -> String.iter (apply tbl f)) [incr; decr] [x; y]; 
      Array.fold_left (fun b r -> b && !r = 0) true tbl
    tentons de le décomposer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let apply tbl f chr = f tbl.(int_of_char chr)
    Définition d'une fonction apply, qui prend un tableau, une fonction, et un caractère, et applique la fonction au contenu de la case du tableau correspondant au caractère. Pas de soucis

    début de la définition de la fonction anagramme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      let tbl = Array.init 256 (fun _ -> ref 0) in
    On définit un tableau, qui contient des références initialement à 0. Contrairement à un bête tableau de 0, on doit passer par la fonction init et non make pour s'assurer que chaque référence est "fraîche", c'est à dire différente des autres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      List.iter2 (fun f -> String.iter (apply tbl f)) [incr; decr] [x; y];
    Décomposons lentement le code :
    List.iter2 aux [incr; decr] [x; y] =>
    iter2 prend successivement les premier éléments des deux listes, leur applique aux, puis les suivant, leur applique aux, etc. Très pratique quand on a deux listes inconnues. Ici, on a deux listes à deux éléments. Le code est donc équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      let aux f = String.iter (apply tbl f) in
      aux incr x;
      aux decr y;
    Pas beaucoup de caractères en plus, et on évite la création de deux listes qui n'ont aucune raison sémantique.
    On constate au passage que List.iter2 attend une fonction à 2 arguments et qu'on lui passe une fonction qui a l'air de n'en avoir qu'un. Il y a en fait application partielle. On aurait pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (fun f str -> String.iter (apply tbl f) str)
    qui fait un code plus lisible puisqu'on voit au premier coup d'oeil qu'il y a deux arguments et que le deuxième est une chaine.

    Dans la version en trois lignes avec une fonction auxiliaire, incr et x sont cote à cote, ainsi que decr et y, alors que dans l'autre, incr et decr étaient regroupés, ainsi que x et y, obligeant à faire une gymnastique visuelle pour voir lequel est applique à qui.

    Reprenons à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      let aux f str = String.iter (apply tbl f) str in
    aux "applique" donc f à chaque caractère de str, c'est à dire si on se souvient de la définition de apply, que pour chaque caractère, aux applique la fonction f au contenu de la case correspondante dans tbl.

    donc, pour chaque caractère de x, on incrémente la référence contenue à la case correspondante de tbl
    et pour chaque caractère de y, on *décrémente* la référence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Array.fold_left (fun b r -> b && !r = 0) true tbl
    finalement on fold sur le tableau une fonction qui vérifie que l'accumulateur est toujours à true et que le contenu de la référence contenue dans la case du tableau est bien à 0, le tout en partant avec un accumulateur initial à true. Dit autrement, on vérifie que chaque case du tableau contient bien une référence à 0. Vu l'absence de Array.forall dans la lib standard, on ne peut pas faire beaucoup plus simple.

    Donc deux chaines sont anagrammes l'une de l'autre si quand on incrémente les références dans un tableau pour chaque caractère de l'une et qu'on décrémente les même références pour chaque caractère de l'autre, on obtient zéro à la fin. Si on obtient zéro, c'est qu'on a incrémenté autant de fois qu'on a décrémenté, donc que chaque caractère apparait autant de fois dans la première et la deuxième chaine.



    Alors pourquoi je trouve que ton code est totalement absurde Cacophrene ?

    Déjà, il est plus long que celui de bluestorm... 238 contre 190 caractères, si si..
    Ensuite, il est *beaucoup* moins clair, puisqu'il faut décomposer des lignes d'applications partielles, et dérouler le code de List.iter2 sur deux listes de longueur 2.
    Il est aussi beaucoup plus crade, puisque tu utilises des tableaux de références alors que les tableaux sont déjà mutables, pour éviter de définir incr_array et decr_array (qui auraient avantageusement remplacés la fonction apply)
    Mais tout ça ne serait rien si il y avait un gain...
    Et finalement, il est nettement plus lent !
    Si on itère 1000 fois sur une chaine de taille 1 000 000, le code de bluestorm prend 11"80, le tiens prend 16"15. Mais là où ça devient drole, c'est que si on itère 1 000 000 de fois sur une chaine de taille 1000, le code de bluestorm passe à 15"30, et le tiens à 36"49 !

    Moralité, un code plus long, incompréhensible, et plus lent, le tout en réponse à un débutant ocaml.

    Je maintiens donc

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Oh là là, elles sont un peu négatives, vos dernières réponses, non ? On est samedi après-midi, les oiseaux chantent, et on ne va pas se battre sur l'écriture d'une fonction de calcul des anagrammes.

    Il me semble que la version de Cacophrène n'avait pas directement pour but d'être simple et compréhensible (il a d'ailleurs dit lui-même qu'il la trouvait «amusante», ce qui sous-entend je pense une certaine forme de contorsionnisme), mais s'inscrivait plutôt dans une habitude des gens sur DVP d'utiliser un topic plus ou moins résolu pour faire un peu de hors sujet, essayer des styles un peu exotiques, ou simplement de l'humour potache.
    Dans l'autre sens, il me semble qu'il ne faut pas prendre le fait de coder en Haskell comme une insulte (ou alors sur un registre humoristique).

    Bref, faites l'amour pas la guerre, tout ça.


    Histoire d'avoir un petit quelque chose de technique dans mon message, une version Haskell:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let anagramme x y = sort x == sort y

  15. #15
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par bluestorm Voir le message
    Oh là là, elles sont un peu négatives, vos dernières réponses, non ? On est samedi après-midi, les oiseaux chantent, et on ne va pas se battre sur l'écriture d'une fonction de calcul des anagrammes.
    Je plussoie, ceci dit chez moi il pleut

    Et histoire de ne pas faire un message inutile j'en profite pour montrer une question un peu arrogante puisqu'elle montre clairement que je n'ai pas lu le manuel de référence en entier, mais :

    Contrairement à un bête tableau de 0, on doit passer par la fonction init et non make pour s'assurer que chaque référence est "fraîche", c'est à dire différente des autres
    Aaah, ça m'intéresse ! Je ne connaissais pas cette fonction et justement j'ai eu des mauvaises surprise de temps en temps avec des enregistrement. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # type truc = { mutable machin : int } ;;
    type truc = { mutable machin : int; }
    # let bidule = { machin = 0 } ;;
    val bidule : truc = {machin = 0}
    # let chose = Array.make 2 bidule ;;
    val chose : truc array = [|{machin = 0}; {machin = 0}|]
    # chose.(0).machin <- 1 ;;
    - : unit = ()
    # chose ;;
    - : truc array = [|{machin = 1}; {machin = 1}|]
    Alors qu'évidemment j'aurais bien aimé que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - : truc array = [|{machin = 1}; {machin = 0}|]
    Du coup pour éviter ça je fais des trucs moches du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # let chose = Array.make 2 { machin = 0 } ;;
    N'y a-t-il pas une astuce pour éviter ça et faire quelque chose d'élégant, à base d'Array.init ou d'une autre fonction que je ne connaitrais pas ?

    PS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let anagramme x y = sort x == sort y
    Joli

  16. #16
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    drunkskater: si justement, il faut utiliser la fonction init, qui appelle une fonction sur chaque case du tableau pour l'initialiser. Tu devrais réussir à le faire tout seul.

    mais s'inscrivait plutôt dans une habitude des gens sur DVP d'utiliser un topic plus ou moins résolu pour faire un peu de hors sujet, essayer des styles un peu exotiques
    C'est une bonne idée.
    Je vous offre ma nouvelle version, redoutable de clarté (sed) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    N
    :l
    s/\(.\)\(.*\)\n\(.*\)\1/\2\
    \3/
    tl
    /^\n$/{
    i\
     yes
    d
    }
    i\
     no
    d

  17. #17
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Je confirme que les oiseaux chantent, j'en ai bien profité ce jour et découvre avec stupeur, le soir venu, le contenu des messages précédents. Que c'est drôle.

    Citation Envoyé par bluestorm
    Oh là là, elles sont un peu négatives, vos dernières réponses, non ? On est samedi après-midi, les oiseaux chantent, et on ne va pas se battre sur l'écriture d'une fonction de calcul des anagrammes.
    En fait ma réponse n'est pas négative. Je constate que le message de TropMDR est à côté de la plaque parce qu'il ne saisit pas l'état d'esprit dans lequel le mien a été écrit. D'ailleurs tu as toi-même très bien compris et expliqué mon intention :

    Citation Envoyé par bluestorm
    Il me semble que la version de Cacophrène n'avait pas directement pour but d'être simple et compréhensible (il a d'ailleurs dit lui-même qu'il la trouvait «amusante», ce qui sous-entend je pense une certaine forme de contorsionnisme), mais s'inscrivait plutôt dans une habitude des gens sur DVP d'utiliser un topic plus ou moins résolu pour faire un peu de hors sujet, essayer des styles un peu exotiques, ou simplement de l'humour potache.
    C'est exactement ça.

    Citation Envoyé par TropMDR
    Moralité, un code plus long, incompréhensible, et plus lent, le tout en réponse à un débutant ocaml.
    Pardon mais ton message reste à côté de la plaque. Tu sais décortiquer un code source, mais tous les habitués du forum savent le faire. À vrai dire, je ne t'ai pas attendu pour savoir que mon code est à la fois peu performant et difficile à lire . En revanche, tu n'as peut-être pas saisi ce je voulais dire avec : Une solution très naïve mais qui m'amuse beaucoup. Une solution naïve, vois-tu, c'est une solution qui n'est optimale à aucun point de vue (algorithmique certes, mais parfois aussi au niveau de la clarté, de la maintenabilité, etc.). Et une solution amusante... tu trouveras sûrement. Pour mémoire, je te rappelle quand même la pointe d'humour de la réponse de gorgonite, antérieure à la mienne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let anagramme ch1 ch2 = true
    Et le PO dans tout ça ? Tout ce qui est important lui a été dit avant : on lui a ainsi recommandé de transformer ses sub_string en index, de limiter les conditions imbriquées, de nettoyer son code et de réfléchir un peu plus à la stratégie adoptée. À ce stade, le topic est résolu, on ne peut pas l'aider plus sans lui donner la réponse...

    Bref, tu le sais pour les prochaines fois : il y aura sans doute d'autres occasions où tu verras une solution naïve et amusante écrite dans un moment de facétie. Évite de la prendre pour argent comptant, ça n'en vaut pas la peine. Je ne suis pas le seul à pratiquer ce style d'humour sur le forum. Va falloir s'y faire.

    Cordialement,
    Cacophrène

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 928
    Points
    928
    Par défaut
    Citation Envoyé par Cacophrene Voir le message
    Citation Envoyé par bluestorm Voir le message
    Il me semble que la version de Cacophrène n'avait pas directement pour but d'être simple et compréhensible (il a d'ailleurs dit lui-même qu'il la trouvait «amusante», ce qui sous-entend je pense une certaine forme de contorsionnisme), mais s'inscrivait plutôt dans une habitude des gens sur DVP d'utiliser un topic plus ou moins résolu pour faire un peu de hors sujet, essayer des styles un peu exotiques, ou simplement de l'humour potache.
    C'est exactement ça.
    Ok ok ! Ce que je propose donc, pour la paix des esprits et que tout le monde soit bien sûr d’être sur la même longueur d’onde, c’est que tu explicites un peu plus clairement quand tu pratiques l’humour potache, surtout au premier message du fils de discussion qui «répond» à la question. Parce que quand tu dis,
    Citation Envoyé par Cacophrene Voir le message
    À ta place, je retournerai gribouiller sur mon brouillon avant de coder quoi que ce soit. Tu verras qu'on peut résoudre ton problème de façon beaucoup plus élégante. Une solution très naïve mais qui m'amuse beaucoup : [...]
    d’aucuns pourraient penser que tu suggères que la troisième phrase est en rapport avec la seconde, puisque sur la même ligne, et que donc tu vois ta solution comme «beaucoup plus élégante. En plus
    Citation Envoyé par Cacophrene Voir le message
    Quant à mon code, je me permets de ne pas le trouver plus obscur que la montagne de conditions et de fonctions récursives imbriquées du PO...
    risquerait de confirmer cette impression au près du lecteur peu averti, même si, bien après, tu ajoutes que
    Citation Envoyé par Cacophrene Voir le message
    À vrai dire, je ne t'ai pas attendu pour savoir que mon code est à la fois peu performant et difficile à lire .
    ce qui prête à confusion.

    A part ça, je te remercie d’apprécier mon niveau à sa juste valeur
    Citation Envoyé par Cacophrene Voir le message
    Tu sais décortiquer un code source, mais tous les habitués du forum savent le faire.
    mais il me semble quand même, à voir le niveau moyen des questions, que ce forum est principalement là pour les débutants.

    Et en parlant du débutant qui nous intéresse ici, quand tu dis
    Citation Envoyé par Cacophrene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let anagramme ch1 ch2 = true
    Et le PO dans tout ça ? Tout ce qui est important lui a été dit avant : on lui a ainsi recommandé de transformer ses sub_string en index, de limiter les conditions imbriquées, de nettoyer son code et de réfléchir un peu plus à la stratégie adoptée. À ce stade, le topic est résolu, on ne peut pas l'aider plus sans lui donner la réponse...
    alors que le PO à demandé juste après ton premier message
    Citation Envoyé par Freedom57 Voir le message
    Qu'est ce que tu endends par index?Si tu peux me donner un exemple(voir si je sais de quoi il s'agit ou pas...)
    on peut penser que toutes les réponses ne lui ont pas encore été totalement donné, et que donc, éventuellement, je ne suis pas le seul à coté de la plaque.

  19. #19
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Eh bien , je ne pensais pas qu'un petit bout de code pouvait créer une telle polémique!

    Je suis d'avis qu'il ne faut effectivement pas résoudre le code à ma place!Cependant , peut être qu'un exemple concret qui utilise des index plutôt que des sub_string pourrait m'aider dans la compréhension de ce qu'est un index car effectivement je n'ai pas saisi:
    Utiliser des entiers pour indiquer la position dans la chaine, plutôt que de calculer des sous-chaines.
    Quand à:
    Je ne sais pas encore utiliser les tableaux , donc pour l'instant je dois faire sans.
    Je me suis peut etre mal exprimé.Mon but pour l'instant n'est pas d'apprendre les tableaux , je ne peux pas m'en servir dans mes copies.De plus il me semble que l'utilisation des tableaux ne fait pas parti intégrante de la programmation fonctionnelle(mais peut etre que je me trompe) , or je dois écrire mes codes uniquement en fonctionnelle pour l'instant.Pas en impératif ni en objet.

    Je n'ai donc pas beaucoup d'outils pour résoudre ce probleme , et de ce fait il existe (d'après ce que j'ai pu voir dans vos post) certainement des façons bien plus efficace de résoudre ce problème par rapport à ce que pourra être ma solution.Cependant je dois résoudre mon problème que avec le peu d'outils que j'ai et que je viens à peine d'acquérir (et certainement dans le but de savoir les maitriser).

    Il est vrai que j'aurais peut être du préciser tout cela au début du post.
    Merci pour vos conseils,
    Cordialement,
    Freedom57.
    P.S.:Je travaille à mon "brouillon" , mon code sera donc à suivre.

  20. #20
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Cependant je dois résoudre mon problème que avec le peu d'outils que j'ai et que je viens à peine d'acquérir (et certainement dans le but de savoir les maitriser).
    Si tu as le droit d'utiliser List.sort, je pense que mon algo est le plus simple à mettre en place (tu dois réécrire quelques lignes pour enlever les traits impératifs, mais c'est simple).

    Dans ton code de départ, je vois des "nth_char ch 0" et des "sub_string". Il faut changer ça et utiliser plutôt "nth_char ch index" où index est un entier que tu calcules (et que tu passeras peut-être en argument).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/01/2006, 14h21
  2. Où est l'erreur?
    Par Paulinho dans le forum C++
    Réponses: 3
    Dernier message: 26/10/2005, 09h48
  3. [VB.NET] Pagination DataGrid (où est l'erreur?)
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/10/2004, 11h46
  4. Ou est l'erreur ?
    Par Antoine NSG dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/09/2004, 10h56
  5. [Erreur] Quel est cette erreur?
    Par netah25 dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/08/2004, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo