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

Contribuez Discussion :

[Défis][3] le carnet d'adresse


Sujet :

Contribuez

  1. #1
    Membre éprouvé
    [Défis][3] le carnet d'adresse
    J'ai un carnet d'adresse, sous forme d'un tableau de struct. Chaque struct contient les champs 'nom' et 'adresse'. Voila un exemple d'un tel carnet :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon_carnet = [struct('nom', 'Alain', 'adresse', '2 rue des carmélites')
    struct('nom', 'Cécile', 'adresse', '7 avenue quejespère')
    struct('nom', 'Odile', 'adresse', '9 rue pasdanslesbrancards')
    struct('nom', 'Bernard', 'adresse', '6 place kezicinoirketimiparlkomsa?')]


    le défi est le suivant :
    Ecrire le code le plus compact(*) possible pour trouver, dans le carnet, l'adresse d'une personne dont on connait le nom.

    ------------------------------------------------------
    (*) un code est compact quand il a :
    • moins de boucles (for-end, while-end, ...)
    • moins de lignes de code
    • moins d'affectations (signe =)
    • moins de variables déclarées


    Pas besoin de hiérarchiser ces critères car toute amélioration de l'un impacte les autres.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  2. #2
    Expert confirmé
    Bonjour,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom_recherche = Odile;
    mon_carnet(strcmp({mon_carnet.nom}, nom_recherche)).adresse


    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Modérateur

    ça marche, mais ça devrait plutôt être :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    mon_carnet(strcmp(nom_recherche,{mon_carnet.nom})).adresse

    d'après la doc

    je sais plus pourquoi mais ca m'est arrivé de me faire jeter en mettant le cellarray en premier sur strcmp

  4. #4
    Membre régulier
    reponse
    Bonjour,


    voici ma petite fonction. J'y compare le code proposé par dut et le mien (le deuxième)
    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
     
    function defi02(nom);
    mon_carnet = [struct('nom', 'Alain', 'adresse', '2 rue des carmélites');
    struct('nom', 'Cécile', 'adresse', '7 avenue quejespère');
    struct('nom', 'Odile', 'adresse', '9 rue pasdanslesbrancards');
    struct('nom', 'Bernard', 'adresse', '6 place kezicinoirketimiparlkomsa?');
    struct('nom', 'fabien', 'adresse', '4 place henridunod');
    struct('nom', 'gerard', 'adresse', '6 avenue lenine');
    struct('nom', 'sandrine', 'adresse', '6 place mentfinancier');
    struct('nom', 'aila', 'adresse', '6 rue édanslesbrancards')];
     
     
    if ~isempty(nom)
    nom_recherche=nom;
    end
    tic
    locAddress=mon_carnet(strcmp(nom_recherche,{mon_carnet.nom})).adresse;
    firstTry=toc
    tic
    index=strcmp(nom_recherche,{mon_carnet(<img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" />.nom});
    locAddress=mon_carnet(find(index)).adresse;
    secTry=toc
     
    disp(locAddress);
    end



    quand le nom recherché est au début de l'annuaire, la fonction de dut est plus rapide, mais plus le nom est loin dans l'annuaire, plus rapide est la mienne.



    defi02('Cécile')
    firstTry =
    4.3413e-004
    secTry =
    4.8721e-004
    7 avenue quejespère
    >> defi02('Cécile')
    firstTry =
    2.2489e-004
    secTry =
    2.7713e-004
    7 avenue quejespère
    >> defi02('fabien')
    firstTry =
    2.4025e-005
    secTry =
    2.3746e-005
    4 place henridunod
    >> defi02('aila')
    firstTry =
    2.4305e-005
    secTry =
    2.3467e-005
    6 rue édanslesbrancards
    >> defi02('Alain')
    firstTry =
    2.3187e-005
    secTry =
    2.3746e-005
    2 rue des carmélites

    on pourrait rajouter du code pour vérifier que le nom recherché est présent dans l'annuaire pour éviter les erreurs, mais comme la concurrence ne l'a pas joint, j'ai voulu surcharger le code.

    A bientôt

  5. #5
    Expert confirmé
    En utilsant les containers:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    [keySet{1:length(mon_carnet ),1}] = deal(mon_carnet.nom);
    [valueSet{1:length(mon_carnet ),1}] = deal(mon_carnet.adresse);
    mapObj = containers.Map(keySet,valueSet)


    Pour connaitre l'adresse d'Odile:

    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks