Défi n°3 : le carnet d'adresse
Venez relever les défis MATLAB.
Le 2012-06-15 17:26:41, par ol9245, Membre éprouvé
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 :
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 :
Pas besoin de hiérarchiser ces critères car toute amélioration de l'un impacte les autres.
Code : |
1 | 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?')] |
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.
-
duf42Expert confirméBonjour,
Code : 1
2
3nom_recherche = Odile; mon_carnet(strcmp({mon_carnet.nom}, nom_recherche)).adresse
le 17/06/2012 à 11:06 -
le fabModérateurça marche, mais ça devrait plutôt être :
Code : mon_carnet(strcmp(nom_recherche,{mon_carnet.nom})).adresse
je sais plus pourquoi mais ca m'est arrivé de me faire jeter en mettant le cellarray en premier sur strcmple 18/06/2012 à 15:43 -
oodbae_adrianoMembre régulierBonjour,
voici ma petite fonction. J'y compare le code proposé par dut et le mien (le deuxième)
Code : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18function 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(:).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ôtle 08/01/2013 à 15:40 -
tug83Expert confirméEn utilsant les containers:
Code : 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)
Code : mapObj('Odile')
le 22/01/2013 à 10:57