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 :

[Tableaux] Combinaisons possibles 0 1


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut [Tableaux] Combinaisons possibles 0 1
    Bonsoir,
    Je créer une fonction qui afficherait toute les solution possibles d'une chaine qui se remplirait de 0 et de 1.

    Exemple avec une chaine de 2 caractères de longueur

    00
    01
    10
    11
    Autre Exemple avec une chaine de 5 caractères de longueur
    00000
    00001
    00011
    00111
    01111
    11111
    10000
    11000
    11100
    11110
    10001
    11001
    11101
    10011
    10111
    10101
    11011

    j'ai fait pas mal de recherche sur le net ( et sur ce forum ) j'ai pu trouver quelques trucs qui marchent partiellement ou qui s'approche de la solution :

    http://www.developpez.net/forums/sho...d.php?t=210962

    Mais je n'ai jamais vraiment pu l'adapter, à chaque fois il manque des possibilités.

    Merci d'avance pour vos conseil.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 219
    Points
    8 219
    Billets dans le blog
    17
    Par défaut
    <blague>
    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
    <?php
        function array_rand_pick($array, $x)
        {
            $n = count($array) ;
            $set = array( ) ;
            for ( $i = 0 ; $i < $x ; $i++ ) {
                $set[ ] = $array[mt_rand(0, $n - 1)] ;
            }
            return $set ;
        }
     
        set_time_limit(5) ;
        header('Content-Type: text/plain') ;
     
        $tokens = array('0', '1') ;
        $length = 5 ;
        $possibilities = pow(count($tokens), $length) ;
     
        $result = array( ) ;
        $found = 0 ;
     
        while ( $found < $possibilities ) {
            $s = implode('', array_rand_pick($tokens, $length)) ;
            if ( ! in_array($s, $result) ) {
                $result[ ] = $s ;
                $found++ ;
            }
        }
     
        echo $possibilities, " résultats\r\n\r\n" ;
        sort($result) ;
        print_r($result) ;
    ?>
    Donne :

    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
    32 résultats
     
    Array
    (
        [0] => 00000
        [1] => 00001
        [2] => 00010
        [3] => 00011
        [4] => 00100
        [5] => 00101
        [6] => 00110
        [7] => 00111
        [8] => 01000
        [9] => 01001
        [10] => 01010
        [11] => 01011
        [12] => 01100
        [13] => 01101
        [14] => 01110
        [15] => 01111
        [16] => 10000
        [17] => 10001
        [18] => 10010
        [19] => 10011
        [20] => 10100
        [21] => 10101
        [22] => 10110
        [23] => 10111
        [24] => 11000
        [25] => 11001
        [26] => 11010
        [27] => 11011
        [28] => 11100
        [29] => 11101
        [30] => 11110
        [31] => 11111
    )
    </blague>

    Joue avec $tokens et $length (pas trop hein), je pense qu'au vu du résultat trié tu pourras facilement déduire un algo
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup, c'est simple et ça fonctionne bien.

    Par contre en effet faut pas trop monter par ce que ça fait vite beaucoup de résultats.

    Ça vient du principe qui est un peut bourrin, comme on tire un chiffre aléatoire et ensuite on vas voir si on l'a déjà jusqu'à ce qu'on ai toutes les solution ça oblige à stocker l'array en cache ce qui demande pas mal de ressources quand le nombre monte.

    Je voudrais tenter d'atteindre 16 et avec ca c'est pas évident.
    Peut être le faire petit à petit avec une base de donnée qui enregistrerait et permettrait de reprendre le calcul.

    Si vous avez mieux je suis preneur.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Points : 40
    Points
    40
    Par défaut
    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
     
    <?php
     
    function combinaisons($longueur){
    	$limite = pow( 2, $longueur );
    	$valeurs = array();
    	for( $i=0; $i<$limite; $i++ ){
    		$valeurs[] = str_pad( base_convert( $i, 10, 2 ), $longueur, '0', STR_PAD_LEFT );
    	}
    	return $valeurs;
    }
     
    $valeurs = combinaisons(5);
    foreach( $valeurs as $v ){
    	print $v.'<br />';
    }
     
    ?>

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 219
    Points
    8 219
    Billets dans le blog
    17
    Par défaut
    Pas mal l'idée du base_convert( )
    Je me permets de la généraliser :

    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
    <?php
        set_time_limit(5) ;
        header('Content-Type: text/plain') ;
     
        $tokens = array('[pomme]', '[fraise]', '[banane]') ;
        $length = 2 ;
     
        $base = count($tokens) ;
        $possibilities = pow($base, $length) ;
     
        $result = array( ) ;
     
        for ( $i = 0 ; $i < $possibilities ; $i++ ) {
            $mask = str_pad(base_convert($i, 10, $base), $length, '0', STR_PAD_LEFT) ;
            $buffer = '' ;
            for ( $j = 0 ; $j < $length ; $j++ ) {
                $buffer .= $tokens[(int)$mask[$j]] ;
            }
            $result[ ] = $buffer ;
        }
     
        echo $possibilities, " résultats\r\n\r\n" ;
        print_r($result) ;
    ?>
    Donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    9 résultats
     
    Array
    (
        [0] => [pomme][pomme]
        [1] => [pomme][fraise]
        [2] => [pomme][banane]
        [3] => [fraise][pomme]
        [4] => [fraise][fraise]
        [5] => [fraise][banane]
        [6] => [banane][pomme]
        [7] => [banane][fraise]
        [8] => [banane][banane]
    )
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Points : 40
    Points
    40
    Par défaut
    Sympa

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    J'ai peur que la généralisation ne soit pas au point.

    Pour mieux voir, j'ai mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tokens = array('a', 'z', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'q', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'w', 'x', 'c', 'v', 'b', 'n') ;
    Et j'obtient, pour $length = 4 :

    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
    aaaa
    aaaz
    aaae
    aaar
    aaat
    aaay
    aaau
    aaai
    aaao
    aaap // jusqu'ici tout vas bien 
    aaaa 
    aaaa
    aaaa
    aaaa
    aaaa
    aaaa
    aaaa
    aaaa
    aaaa // répétition par ce que ça tronque ? 
    aaaa
    aaaa
    aaaa
    aaaa
    aaaa
    aaaa
    aaaa
    aaza // on repart normalement
    aazz
    aaze
    aazr
    aazt
    aazy
    aazu
    aazi
    aazo
    aazp
    aaza // même problème qui se répète 
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaza
    aaea
    Je comprend pas assez bien la généralisation pour voir d'ou ca vient ( le $tokens[(int)$mask[$j]] est un poil obscure pour moi ).

    Mais je voudrais bien comprendre.
    Si quelqu'un à une idée comme toujours il est le bienvenu.
    ( merci à tout ceux qui m'en ont donné jusqu'ici )

Discussions similaires

  1. Stocker dans un tableau toutes les combinaisons possibles entre plusieurs tableaux.
    Par gui-yem dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 19/03/2014, 15h22
  2. Trouver toutes les combinaisons possibles de plusieurs tableaux
    Par divayht dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 23/08/2010, 20h56
  3. Parcourir des tableaux, toutes combinaisons possibles ?
    Par seb92500 dans le forum Langage
    Réponses: 9
    Dernier message: 20/11/2008, 17h11
  4. toutes les combinaisons possibles
    Par marocleverness dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 29/05/2006, 00h11
  5. Sortir d'un tableau les combinaisons possibles
    Par juelo dans le forum Algorithmes et structures de données
    Réponses: 33
    Dernier message: 26/03/2006, 17h11

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