1

各ゲームの上位 2 つの「スコア」を勝者としてマークするゲームを作成しています。

2 つのスコアが同じ場合、タイブレークが必要になります (2 つの一致するスコアが 1 位と 2 位でない場合)。

次の可能性についてこれらの結果を返す関数を(効率的に)作成するにはどうすればよいですか。

6 つの異なるゲームで考えられるゲーム結果:

$a = array(20,19,18,17,16,15); // no tie breaker needed - [1], [2] win
$b = array(20,20,18,17,16,15); // no tie breaker needed - [1], [2] win
$c = array(20,19,19,17,16,15); // tie breaker needed for [2], [3] values
$d = array(20,20,20,17,16,15); // tie breaker needed for [1], [2], [3] values
$e = array(20,19,19,19,16,15); // tie breaker needed for [2], [3], [4] values
$f = array(20,20,20,20,20,20); // tie breaker needed for all values

編集:解決策:

<?php
$score = array("green"=>10, "pink"=>10, "orange"=>9, "blue"=>8, "yellow"=>7);
$count = 0;

foreach ($score as $value) {

    $count++;

    // if the count is 2
    if ($count === 2) {

        // save the value as a variable
        $second = $value;

    // if the count is 3
    } else if ($count === 3) {

        // if 2nd place and 3rd place have the same score - tiebreaker
        if ($second === $value) {

            // add matches to array for tiebreaker
            $result = array_keys($score, $value);

        // if 2nd place and 3rd place have different scores - no tiebreaker
        } else {

            // split first 2 places from the array
            $result = array_slice($score, 0, 2);                

        }

    }

}
?>
4

1 に答える 1

3

私の推測では、ランク付けしているオブジェクトの一部としてスコア以上のものがあると思います (そうでなければ、「どの」生スコアが最初であるかは重要ですか?)。結果を比較するために使用しているコンパレーターでは、追加のデータを考慮することができます。したがって、オブジェクトが実際に次のようになっている場合 (PHP ではなく、JSON オブジェクト形式です。許してください):

{
"name":"frank",
"score":20,
"class":"wizard",
"level":44
}

usort()PHP ルーチンを使用してオブジェクト配列をソートするときに、アルファ名またはレベルを使用するか、「ウィザード」クラスを他のクラスよりも上に配置するかを決定できます。それらが何であれ、それらのルールを実装する関数を提供するだけです。 この回答には例があります。

更新:OPは同点を検出したい

リストを繰り返し処理して、同点のセットを検出できます。擬似コード:

for each item in scorelist:
    // create hash of score->list of items
    scoreRef[item.score].append(item)

// scoreRef is a hash of scores => list of 
// items that share that score.

for each item in scoreRef:
    // item is an array
    if item.size > 1:
        tiebreakerList.append( item);

// tiebreakerList is a list of lists where 
// the subordinate list items all share the same 
// number of points
于 2013-07-29T14:40:59.310 に答える