Question

Comment puis-je trouver le numéro de toutes les séries (combinaisons d'un tableau qui ont au moins 3 valeurs consécutives, comme [7,8,9]) et ont le plus nombre de valeurs?

de [3,4,1,2,2] il serait 2 - ([1,2,3,4] deux fois, mais ignorer [1,2,3] * 2 et [2,3,4 ] * 2)

à partir de [9,6,7,5,8], il serait 1 - ([5,6,7,8,9])

à partir de [1,2,3,1,2], il serait 4 ([1,2,3] * 3)

Merci


modifier

le point de ceci est de compter courses dans une main de crèche. Peu importe quel ordre le tableau a la série en tant que la série ne se chevauchent pas compté toutes les cartes.


modifier 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] ++;
    }
}

cela va créer un tableau ($ rangs) qui ont ces valeurs [2:2, 3:1, 4:1, 9:1]

de ce que je serai en mesure de multiplier les valeurs sous 2,3 ad4 4 et les multiplier par 3, donc je recevrais 2 * 1 * 1 * 3

Je suis en train de comprendre maintenant comment trouver les valeurs consécutives, et ignorer ceux qui ne sont pas (comme le 9)

Était-ce utile?

La solution 2

cela fonctionne: il utilise casalib pour min / max, mais il y a d'autres moyens de le contourner. ce onlu trouve le plus grand ensemble de nombres consécutifs si, comme il est censé compter une main de crèche qui a un maximum de 5 cartes, donc pas de deux séries simultanées sont possibles (comme 2,3,4 et 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;
}

I a trouvé les nombres consécutifs à travers la matrice de seq $, en poussant des valeurs à chaque fois que les rangs de $ [i] est une valeur, si la longueur est supérieure à 3 et râpe de la rangée la plus longue $, copier la matrice plus (avec concat ()!), s'il n'y a pas de valeur, $ suivants obtient remis à zéro.

il est si simple une fois que vous savez ...


modifier Je remarqué que j'avais une faute de frappe dans le code

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

aurait été

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

Autres conseils

Vous souhaitez commander vos valeurs et de remplacer tous les doublons avec un tableau d'eux-mêmes. par exemple.

//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]

Alors, vous voulez trouver la plus grande séquence consécutive et éliminer les violations.

//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]

Ensuite, il sera question de multiplier la longueur de tous vos tableaux pour trouver votre score.

Une fois que vous avez nettoyé votre tableau, vous pouvez penser à la formule comme celui-ci.

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;

Il devrait être assez amusant de trouver comment écrire dans votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top