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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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
    Membre à l'essai
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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
    Membre à l'essai
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 !

+ 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