6

すべての系列 ([7,8,9] のように、少なくとも 3 つの連続した値を持つ配列の組み合わせ) の数を見つけ、値の数が最も多いのはどうすればよいですか?

[3,4,1,2,2] からは 2 - ([1,2,3,4] が 2 回になりますが、[1,2,3]*2 と [2,3,4]*2 は無視されます)

[9,6,7,5,8] から 1 - ([5,6,7,8,9])

[1,2,3,1,2] から 4 ([1,2,3] * 3) になります

ありがとう


編集

これのポイントは、クリブ ハンドでランをカウントすることです。カウントされたシリーズがすべてのカードと重ならない限り、アレイがどのような順序でシリーズを持っているかは問題ではありません。


編集 1

var $cards:Array = [9, 4, 3, 2, 2];
var $ranks:Array = [];
var $c:int;
for each ($c in $cards) {
    if ($ranks[$c] == null) {
        $ranks[$c] = 1;
    }else {
        $ranks[$c] ++;
    }
}

これにより、これらの値を持つ配列 ($ranks) が作成されます[2:2, 3:1, 4:1, 9:1]

これから、2,3 ad4 4 の下の値を掛けて 3 を掛けることができるので、2*1*1 * 3 が得られます。

私は今、連続した値を見つける方法を理解しようとしており、そうでないもの (9 など) を無視します。

4

2 に答える 2

2

値を並べ替え、すべての重複をそれ自体の配列に置き換えたいとします。すなわち。

//Order values and group matches
[3,4,1,2,2] = [1,[2,2],3,4]
[9,6,7,5,8] = [5,6,7,8,9]
[1,2,3,1,2] = [[1,1],[2,2],3]

次に、最大の連続シーケンスを見つけて違反を削除します。

//remove violations (6,7,8)... which I guess you also want to count separately.
[1,[2,2],3,4,6,7,8] = [1,[2,2],3,4]

次に、すべての配列の長さを掛けてスコアを見つけます。

配列をきれいにしたら、式は次のように考えることができます。

array2 = [2,2];
array1 = [1, array2, 3, 4];
score = array1.length * array2.length = 8;

array3 = [3,3,3];
array2 = [2,2];
array1 = [1, array2, array3, 4];
score = array1.length * array2.length * array3.length = 24;

これをコードで記述する方法を理解するのはかなり楽しいはずです。

于 2011-01-02T19:05:53.097 に答える
1

これは機能します。最小/最大にcasalibを使用していますが、他の方法があります。このonluは、最大5枚のカードを持つクリベッジハンドを数えることを目的としているため、連続する数字の最大のセットを見つけます。したがって、2つの同時シリーズは不可能です(2、3、4、9、10、11など)。

private function countRuns($cards:Array):int {
    var $ranks:Array = [];
    var $c:int;

    for each ($c in $cards) {
        if ($ranks[$c] == null) {
            $ranks[$c] = 1;
        }else {
            $ranks[$c] ++;
        }
    }

    var $highest:int = ArrayUtil.getHighestValue($cards);
    var $lowest:int = ArrayUtil.getLowestValue($cards);
    var $seq:Array = [];
    var $longest:Array = [];
    for (var i:int = $lowest; i <= $highest; i++) {
        if ($ranks[i] != null) {
            $seq.push($ranks[i]);
            if ($seq.length > $longest.length && $seq.length > 2) {
                $longest = $seq.concat();
            }
        }else {
            $seq = [];
        }
    }

    var $total:int = $longest.length;
    for each ($c in $longest) {
        $total *= $c;
    }
    trace($total, $cards);
    return $total;
}

$ranks [i]に値がある場合は常に値をプッシュすることにより、$ seq配列から連続する数値を見つけました。長さが3より大きく、$ longest配列よりも大きい場合は、配列をコピーします(concat()を使用)。 )、値がない場合、$seqはリセットされます。

一度知ったらとても簡単です...


編集 コードにタイプミスがあることに気づきました

if ($seq.length > $longest.length || $seq.length >= 2)

になるはずだった

if ($seq.length > $longest.length && $seq.length > 2)

于 2011-01-02T20:22:04.137 に答える