2009-05-12 14 views
1

Je fais un jeu Yahtzee et j'ai besoin d'un moyen de calculer une petite suite (une séquence de 4 numéros dans l'ordre). Donc, ceux qui sont valides seraient: 1,2,3,4 | 2,3,4,5 | 3,4,5,6.Trouver une séquence de nombres dans un tableau

J'ai un tableau de 5 nombres et j'ai besoin de comprendre si l'une de ces 3 combinaisons est dans ce tableau.

Pour ceux qui ne sont pas familiers avec Yahtzee, il y a 5 dés (les cinq nombres dans le tableau) qui peuvent être de 1-6.

+0

Avez-vous une partie de l'état avant la main? Si oui, vous pouvez obtenir de meilleurs résultats (vitesse). – Milhous

+0

Que voulez-vous dire par état? Je passe juste un tableau de 5 nombres à n'importe quelle fonction. – roflwaffle

Répondre

5
function isStraight($hand) { 
    $straights = array(range(1, 4), range(2, 5), range(3, 6)); 
    foreach($straights as $solution) { 
     if(array_intersect($solution, $hand) == $solution) { 
      return $solution; 
     } 
    } 
    return false; 
} 

$hand = array(1,5,2,4,3); 

var_dump(isStraight($hand)); 

Vous n'êtes pas sûr des règles du jeu, mais vous devriez le faire. La fonction va retourner la première solution trouvée - dans ce cas [1,2,3,4]. Il va retourner le booléen false s'il ne trouve aucune ligne droite dans la main. J'espère que cela t'aides.

+0

Battez-moi +1 – da5id

+0

Hé, votre réponse est de retour ... Array s'entrecroisent ... oh ouais ... – cgp

+0

A dû fuir et dîner avant de revenir pour le réparer. :) –

1

Peut-être quelque chose comme ceci: --- --- avertissement codage de l'air

function findSequenceLength(array $array) 
{ 
    // Filter duplicates out - and sort the array. 
    $sorted = array_unique($array, SORT_NUMERIC); 

    $lastValue = null; 
    $thisSeq = 0; 
    $longestSeq = 0; 
    foreach ($sorted as $value) 
    { 
    if (($lastValue !== null) && $value == $lastValue + 1) 
    { 
     // our value is exactly one above the last entry 
     // increase the counter 
     $thisSeq++; 
    } else { 
     // sequence ended - save the value 
     $longestSeq = max($longestSeq, $thisSeq); 
     $thisSeq = 1; 
    } 
    $lastValue = $value; 
    } 
    return max($longestSeq, $thisSeq); 
} 

$sequence = array(1,2,4,5,4,6); 
echo findSequenceLength($sequence); // should return 3 [4,5,6] 

Vous pouvez ensuite tester que la « longueur de la séquence » est> = 4 pour tester votre « petit droit »

0

Plus précisément:

function array_match($array, $target_array) { 
    $offset = 0; 
    $maxoffset = sizeof($target_array) - sizeof($array); 
    for($y=0;$y<$maxoffset;$y++) { 
    $result = true; 
    for($x=0;$x<sizeof($array);$x++) { 
     if ($array[$x] != $target_array[$x+$y]) { 
     $result = false; 
     continue; 
     } 
    } 
    if ($result) 
     return "true"; 
    } 
    return "false"; 
} 
echo array_match(array(1,2,3), array(1,2,3,4,5)); //true 
echo array_match(array(1,2,3), array(4,1,2,3,5)); //true 
echo array_match(array(1,2,3), array(4,2,2,1,2)); //false 
0

Voici une autre idée, utilisez une méthode isStraight() générique et l'utiliser pour tester les deux tranches de tableau.

$tests = array(
      array(1,2,3,4,5), 
      array(1,1,2,3,4), 
      array(4,3,2,1,4), 
      array(3,4,5,6,1) 
     ); 
foreach($tests as $test) { 
    print_r($test); 
    echo "Straight: "; 
    var_dump(isStraight($test)); 
    echo "Short Straight: "; 
    var_dump(isShortStraight($test)); 
    echo "\n"; 
} 

function isShortStraight($hand) { 
    return isStraight(array_slice($hand, 0, 4)) || 
      isStraight(array_slice($hand, 1, 4)); 
} 

function isStraight($hand) { 
    $unique = array_unique($hand); 
    if (count($hand) != count($unique)) { 
     /* Has Duplicates, not a straight */ 
     return false; 
    } 

    sort($unique); 
    if ($unique != $hand) { 
     /* Sort order changed, not a straight */ 
     return false; 
    } 
    return true; 
} 
Questions connexes