2009-05-12 4 views
1

Ich mache ein Yahtzee-Spiel und ich brauche eine Möglichkeit, eine kleine Straße zu berechnen (eine Folge von 4 Zahlen in der richtigen Reihenfolge). So wären die gültigen: 1,2,3,4 | 2,3,4,5 | 3,4,5,6.Eine Folge von Zahlen in einem Array finden

Ich habe ein Array von 5 Zahlen und ich muss herausfinden, ob eine dieser 3 Kombinationen in diesem Array ist.

Für diejenigen, die mit Yahtzee nicht vertraut sind, gibt es 5 Würfel (die fünf Zahlen im Array), die von 1-6 sein können.

+0

Haben Sie etwas von dem Staat vor der Hand? Wenn ja, können Sie bessere Ergebnisse (Geschwindigkeit) erzielen. – Milhous

+0

Was meinst du mit Staat? Ich gebe gerade eine Reihe von 5 Zahlen an jede Funktion weiter. – roflwaffle

Antwort

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)); 

Nicht sicher über die Regeln des Spiels, aber das sollte es tun.

Die Funktion wird die erste gefundene Lösung zurückgeben - in diesem Fall [1,2,3,4]. Es wird die boolesche false zurückgeben, wenn es keine Geraden in der Hand findet. Hoffe das hilft.

+0

Beat mich dazu +1 – da5id

+0

Hey, deine Antwort ist zurück ... Array schneiden ... oh yeah ... – cgp

+0

Hatte zu laufen und zu Abend essen, bevor Sie zurückkommen, um es zu beheben. :) –

1

Vielleicht so etwas: --- --- Warnung Luft Codierung

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] 

Sie könnten dann testen, ob die "Sequenzlänge" ist> = 4 bis Test für Ihre "kleine gerade"

0

Genauer gesagt:

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

eine andere Idee Hier ist, verwenden sie eine generische isStraight() Methode und verwenden sie die beiden Array Scheiben zu testen.

$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; 
} 
Verwandte Themen