查找数组中的所有系列

时间:2011-01-02 07:11:34

标签: flash actionscript-3 combinations series

如何找到所有系列的数量(具有至少3个连续值的数组的组合,如[7,8,9])并且具有最长的数值?

从[3,4,1,2,2]它将是2 - ([1,2,3,4]两次,但忽略[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] ++;
    }
}

这将创建一个具有这些值[2:2, 3:1, 4:1, 9:1]

的数组($ rank)

由此我将能够乘以2,3 ad4 4下的值并将它们乘以3,所以我得到2 * 1 * 1 * 3

我现在想弄清楚如何找到连续的值,而忽略那些不连续的值(如9)

2 个答案:

答案 0 :(得分: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;

如何在代码中编写代码应该很有趣。

答案 1 :(得分:1)

这有效: 它使用casalib进行最小/最大,但还有其他方法。这个onlu找到了最大的一组连续数字,因为它意味着计算一个最多有5张牌的婴儿手牌,因此不可能有两个同时发生的系列(如2,3,4和9,10,11)< / p>

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

我通过$ seq数组找到了连续的数字,每当$ rank [i]有一个值时推送值,如果长度大于3并且大于$ longest数组,则复制数组(使用concat) ()!),如果没有值,则$ seq重置。

一旦你知道就这么简单......


修改 我注意到代码中有一个拼写错误

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

应该是

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