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

Langage PHP Discussion :

Test algo PHP pour candidature stage


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Test algo PHP pour candidature stage
    Salut tout le monde,

    j'ai postulé dans une boîte pour faire du Web et ils m'ont demandé de faire quelques "fonctionnalités" en guise de test. A priori j'ai pas eu trop de problème à les réaliser (j'ai testé ça a l'air de marcher) mais bon j'aimerais votre avis, si possible, pour savoir si c'est optimal, ou si j'ai pas oublié quelque chose... je tiens pas mal à ce stage donc j'aimerais leur envoyer un truc parfait

    Voici le lien du test :

    http://pdfcast.org/pdf/test-php

    Ce que j'ai fait pour l'étape 1 :

    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
    40
    41
    42
    43
    44
    45
    46
    <?php
    $bestBrands = array(
        "Adidas" => 153,
        "Converse" => 193,
        "Nike" => 124,
        "Asics" => 67,
    );
     
    function randomBrand($bestBrands)
    {
        // Vérification que l’argument soit bien un tableau
        if(!is_array($bestBrands))
        {
     // Si ce n’est as le cas, on lève une exception
           throw new Exception('Argument non-compatible.');
        }
        else
        {
      // Initialisation de la marque qui sera retourné par la fonction
      $randomBrand = '';
            // Récupération du nombre total de voix pour le sondage
      $totalVoices = array_sum($bestBrands);
      // Generation d’un nombre aléatoire entre 0 et le nombre de voix
      $rand = rand(0, $totalVoices);
      // Algorithme de recuperation de la marque tirée aléatoirement
      $iterator = 0 ;
      foreach($bestBrands as $name => $value) {
      	if ($rand <= $iterator+$value) {
       	   $randomBrand = $name;
        	   break;
      	}
        $iterator+=$value;
    }
        }
        return $randomBrand;
    }
     
     
    try {
        $randomBrand = randomBrand($bestBrands);
        echo $randomBrand;
    } catch (Exception $e) {
        echo 'Exception reçue : ',  $e->getMessage(), "\n";
    }
     
    ?>
    Ce que j'ai fait pour l'etape 2:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php
    $bestBrands = array(
        "Adidas" => 153,
        "Converse" => 193,
        "Nike" => 124,
        "Asics" => 67,
    );
     
    function randomBrand($bestBrands)
    {
        // Vérification que l’argument soit bien un tableau
        if(!is_array($bestBrands))
        {
     // Si ce n’est as le cas, on lève une exception
           throw new Exception('Argument non-compatible.');
        }
        else
        {
      // Initialisation de la marque qui sera retourné par la fonction
      $randomBrand = '';
            // Récupération du nombre total de voix pour le sondage
      $totalVoices = array_sum($bestBrands);
      // Generation d’un nombre aléatoire entre 0 et le nombre de voix
      $rand = rand(0, $totalVoices);
      // Algorithme de recuperation de la marque tirée aléatoirement
      $iterator = 0 ;
      foreach($bestBrands as $name => $value) {
      	if ($rand <= $iterator+$value) {
       	   $randomBrand = $name;
        	   break;
      	}
        $iterator+=$value;
    }
        }
        return $randomBrand;
    }
     
    function randomList($bestBrands)
    {
        	// Initialisation de la liste à retourner
        	$randomList = array();
        	// Initialisation de la liste des marques réduite à chaque tirage
    	$temporaryList = $bestBrands;
    	// Vérification que l’argument soit bien un tableau
        	if(!is_array($bestBrands))
        	{
    // Si ce n’est as le cas, on lève une exception
          throw new Exception('Argument non-compatible.');
        	}
        	else
        	{
    		while(count($temporaryList)>0) {
    			// Appel de la fonction randomBrand sur la liste
    			$randomBrand = randomBrand($temporaryList);
    			// Ajout dans la liste à retourner
    			array_push($randomList, $randomBrand);
    			// Suppression de l’élement dans la liste temporaire
    			unset($temporaryList[$randomBrand]);
    		}
    	}
    	return $randomList;
    }
     
     
    try {
        $randomList = randomList($bestBrands);
        var_dump($randomList);
    } catch (Exception $e) {
        echo 'Exception reçue : ',  $e->getMessage(), "\n";
    }
     
    ?>


    Un enorme merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu peux mieux faire.
    Dans la première fonction il est possible de typer ton paramètre et d'économiser ainsi le test : function randomBrand(array $bestBrands) { ... }, ensuite je ne vois pas comment tu respectes un énoncé du problème : la corrélation entre probabilité de tirage d'un élément et sa fréquence dans l'ensemble des éléments.

    Dans le deuxième fichier, il est inutile de dupliquer le code de la première fonction, il suffit de l'inclure avec un include ...;.
    Tu peux également typer le paramètre de la deuxième fonction, array_push() peut être avantageusement remplacé par $randomList[] = ...; et faire un while(count()) { ... } n'est pas performant du tout, il est préférable de faire un while( ! empty(...)) { ... }.

    Bref y a encore un peu de travail.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Salut,

    déjà merci pour ta réponse

    Pour le typage ok, j'avais vu en regardant un peu sur le net que en php fallait mieux "eviter"... m'enfin les mecs avaient pas l'air sûrs d'eux, ça me parait bien de typer aussi.
    Mais du coup comment je gere si c'est pas le bon type dans l'appel de la fonction ? le try / catch marchera toujours ?

    Pour ce qui est des probabilités pondérées, ça marche, étudie un peu la boucle foreach avec l'iterator si t'as le temps, en fait à chaque fois ça regarde si le rand tiré est dans un intervalle de voix de chaque marque.

    Le include oui ça j'allais le faire, j'avais laisser tel quel pour tester rapidement mais je vais changer ça.

    Merci pour tes petits trucs aussi pour l'ajout du tableau et le while, je change ça tout de suite.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Un conseil : type tes paramètres quand tu peux le faire.
    Si un appel de fonction ne correspond pas au prototype de cette dernière alors PHP levera automatiquement une exception.

    Les try { ... } catch { ... } ne sont pas nécessaires vu qu'en typant tes paramètres, PHP gère pour toi la levée des exceptions.

    Repenche-toi sur tes probabilités pondérées avec un tableau des éléments de ce genre et vérifie ton algo avec un $rand = 100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $bestBrands = array(
        "Adidas" => 100,
        "Converse" => 100,
        "Nike" => 124,
        "Asics" => 67,
    );
    Jouer avec le hasard en y mélant des probabilités, ça peut se révéler piégeux.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Noté pour le typage. Du coup je fais ça tout de suite. Ca m'avait juste titillé parce que dans l'enoncé y'a marqué une question genre "comment feriez-vous appel à cette fonction" donc je me suis dit qu'ils attendaient un truc un peu plus elaboré qu'un bete appel, mais peut-être pas...

    Pour l'algo de probabilité, je l'ai testé de diverses façon tkt pas, franchement il a l'air de bien fonctionner. Après c'est sûr en proba t'as tjrs un doute, le meilleur moyen de verifier ça reste de verifier sur de (très) nombreux essais, mais faudrait que je le code aussi et j'ai pas vraiment le temps...

    Mais t'as l'air bien suspicieux sur mon algo, t'as l'impression qu'il deconne ou c'est juste que tu me recommandes d'être très prudent ?

    EDIT: en fait pour tester je faisais un echo du rand, puis je verifiais que la marque donné correspondait bien à l'intervalle dans lequel se trouvait ce rand.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Allez on va dépieuter ton algo avec pour éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $bestBrands = array(
        "Adidas" => 100,
        "Converse" => 100,
        "Nike" => 124,
        "Asics" => 67,
    );
    on pose un $rand = 100;
    --- première itération ---
    $iterator = 0
    $name = 'Adidas'
    $value = 100
    $rand est <= à (0+100) -> $randomBrand = 'Adidas' et on sort de la boucle
    
    Avec ton algo, 'Converse' ne sortira jamais !

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Ben oui c'est normal, l'algo a trouvé sa marque donc il sort de la boucle et les autres marques ne sortiront jamais

    je vois pas où est le problème ...

    Je viens de tester avec tes valeurs (adidas et converse à 100), ben pas de souci, il arrive toujours à sortir Converse ...

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    T'es sûr de toi parce que de mon côté j'obtiens toujours Adidas...

    Tu influes sur le hasard dans la mesure où dans le cas d'une équiprobabilité, cela sera toujours le premier élément equiprobable qui sortira et ta boucle n'atteindra jamais le second élément equiprobable.

    Pour préciser : quand 100 est tiré, tu devrais avoir autant de chances de tirer Adidas que Converse alors que dans ton cas, pour 100 tu auras toujours Adidas

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je crois que t'as pas bien compris comment mon algo fonctionne, je vais tenter de t'expliquer.

    Effectivement y'a pas d'equiprobabilité ici, c'est la subtilité. Pour y pallier, je joue avec les intervalles :

    Voici le tableau de départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $bestBrands = array(
        "Adidas" => 153,
        "Converse" => 193,
        "Nike" => 124,
        "Asics" => 67,
    );
    je sors un rand entre 0 et 537 (c a d le nombre total de voix).

    Admettons que le rand sorti soit 400, l'algo fonctionne comme suit :

    Est-il dans l'intervalle Adidas (entre 0 et 153) ? non, on continue.
    Est-il dans l'intervalle Converse (entre 154 et 154+193=346) ? non, on continue.
    Est-il dans l'intervalle Nike (entre 347 et 347+124=471) ? oui, l'algo s'arrete et sort la marque "Nike".

    Forcément avec ton rand fixe, il sortira toujours Adidas avec cet algo.

    Tu comprends comment il fonctionne du coup ?

    (Bon petite précision, en verité c'est l'intervalle entre 0 et 346 pour Converse, et 0 et 471 pour Nike, etc...mais c'est pas grave puisqu'on sait que le rand ne se trouve pas dans l'intervalle d'avant).

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    J'y ai mis le temps mais oui, c'est une très bonne approche.
    J'avais pas suivi les sommes des intervalles.

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Cool :p

    Bon bah il me reste plus qu'à mettre tout ça au propre vu que j'ai déjà changé tout ce dont tu m'as parlé. Puis à envoyer ça demain

    Merci pour ton aide précieuse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. script php pour test de continuité (ping)
    Par gliricidialo dans le forum Langage
    Réponses: 9
    Dernier message: 26/03/2010, 21h13
  2. Réponses: 15
    Dernier message: 10/06/2009, 09h19
  3. Script php pour faire test d'éligibilité chez Neuf
    Par hssine dans le forum Langage
    Réponses: 1
    Dernier message: 16/05/2008, 09h53
  4. Réponses: 4
    Dernier message: 07/07/2006, 12h41
  5. [Stage] Quand offrir sa candidature pour un stage?
    Par radicalrider dans le forum Stages
    Réponses: 20
    Dernier message: 04/08/2005, 10h31

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