найти все серии в массиве - PullRequest
6 голосов
/ 02 января 2011

Как найти номер всех серий (комбинаций массива, которые имеют как минимум 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)

Спасибо


изменить

точкаэто подсчитать пробеги в кроватке.Неважно, в каком порядке массив содержит серию, пока подсчитанные серии не перекрывают все карты.


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

Ответы [ 2 ]

2 голосов
/ 02 января 2011

Вы хотите упорядочить свои значения и заменить все дубликаты самим массивом. то есть.

//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 голос
/ 02 января 2011

это работает: он использует 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 сбрасывается.

это так просто, когда ты знаешь ...


1010 * редактировать * Я заметил, что в коде была опечатка

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

должно было быть

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

...