2011-01-02 15 views
6

Come si trova il numero di tutte le serie (combinazioni di un array che hanno almeno 3 valori consecutivi, come [7,8,9]) e hanno il numero più lungo di valori?trovare tutte le serie all'interno di un array

da [3,4,1,2,2] sarebbe 2 - ([1,2,3,4] due volte, ma ignorare [1,2,3] * 2 e [2,3, 4] * 2)

da [9,6,7,5,8] sarebbe 1 - ([5,6,7,8,9])

da [1,2,3 , 1,2] che sarebbe stato 4 ([1,2,3] * 3)

Grazie


modificare

012.351.641.061.

il punto di questo è contare le esecuzioni in una mano di presepe. Non importa in quale ordine la serie ha le serie, purché le serie contate non si sovrappongano a tutte le carte.


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

questo creerà un array ($ ranghi) che avrà questi valori [2:2, 3:1, 4:1, 9:1]

da questo io sarò in grado di moltiplicare i valori sotto i 2, 3 4 4 e moltiplicarli per 3, quindi vorrei ottenere 2 * 1 * 1 * 3

Sto cercando di capire ora come trovare il consecutivo valori, e ignorare quelli che non lo sono (come il 9)

+0

consecutiva dall'inizio della Array o da qualsiasi luogo ? – Patrick

risposta

1

questo funziona: sta usando casalib per min/max, ma ci sono altri modi intorno ad esso. questo onlu trova comunque il numero più grande di numeri consecutivi, poiché è destinato a contare una mano di presepe che ha un massimo di 5 carte, quindi non sono possibili due serie simultanee (come 2,3,4 e 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; 
} 

ho trovato i numeri consecutivi attraverso l'array $ seq, spingendo valori ogniqualvolta le $ ranghi [i] ha un valore, se la lunghezza è maggiore di 3 e grattugia quella più lunga matrice $, copiare la matrice sopra (con concat()!), se non c'è alcun valore, $ seq viene ripristinato.

è così semplice una volta che sai ...


modificare ho notato che avevo un errore di battitura nel codice

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

avrebbe dovuto essere

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

+0

@Daniel. È possibile utilizzare le funzioni incorporate 'Math.max' e' Math.min', poiché accettano gli argomenti 'rest'. 'Math.max.apply (null, $ cards);' –

+0

Puoi anche ordinare $ cards usando $ cards.sort() e poi prendi il primo e l'ultimo. – Nicholas

+0

questo è un bel trucco, non lo sapevo. Ho guardato casalib per vedere come è stato fatto (minimo) 'return inArray [inArray.sort (16 | 8) [0]];'. Sono curioso di come si paragona al Math.min – Daniel

2

Si desidera ordinare i valori e sostituire tutti i duplicati con un array di se stessi. vale a dire.

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

Quindi si desidera trovare la sequenza consecutiva più grande e rimuovere le violazioni.

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

allora sarà una questione di moltiplicando la lunghezza di tutti gli array per trovare il tuo punteggio.

Una volta pulito l'array, è possibile pensare alla formula come questa.

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; 

Dovrebbe essere piuttosto divertente capire come scrivere questo in codice.

+0

Sono arrivato così lontano, non so come controllare se la sequenza è in ordine, modifico il post per mostrare quello che ho ottenuto così lontano (modifica 1) – Daniel

+0

puoi usare array.sortOn per inserirlo ordine. – Nicholas

+0

ma non mi dice che 9 è il dispari fuori – Daniel

Problemi correlati