6

如何找到所有系列的数量(具有至少 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] ++;
    }
}

这将创建一个包含这些值的数组 ($ranks)[2:2, 3:1, 4:1, 9:1]

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

我现在试图弄清楚如何找到连续的值,并忽略那些不是的(比如 9)

4

2 回答 2

2

您想对您的值进行排序并用它们自己的数组替换所有重复项。IE。

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

我通过 $seq 数组找到了连续的数字,只要 $ranks[i] 有一个值就推送值,如果长度大于 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 回答