2011-01-02 11 views
6

¿Cómo encuentro el número de todas las series (combinaciones de una matriz que tienen al menos 3 valores consecutivos, como [7,8,9]) y tengo el mayor número de valores?buscando todas las series dentro de una matriz

de [3,4,1,2,2] sería 2 - ([1,2,3,4] dos veces, pero ignore [1,2,3] * 2 y [2,3, 4] * 2)

de [9,6,7,5,8] sería 1 - ([5,6,7,8,9])

de [1,2,3 , 1,2] sería 4 ([1,2,3] * 3)

Gracias


editar

El objetivo de esto es contar carreras en una mano de cuna. No importa en qué orden tenga la matriz la serie, siempre que las series contadas no superpongan todas las cartas.


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

esto creará una matriz (filas $) que tendrá estos valores [2:2, 3:1, 4:1, 9:1]

de esta voy a ser capaz de multiplicar los valores por debajo de 2, 3 ad4 4 y multiplíquelos por 3, así obtendría 2 * 1 * 1 * 3

Estoy tratando de averiguar ahora cómo encontrar el consecutivo valores, e ignore los que no (como el 9)

+0

consecutiva desde el inicio de la matriz o de cualquier parte ? – Patrick

Respuesta

1

esto funciona: está usando casalib para min/max, pero hay otras formas de evitarlo. este onlu encuentra el mayor conjunto de números consecutivos, ya que está destinado a contar una mano de cuna que tiene un máximo de 5 cartas, por lo que no son posibles dos series simultáneas (como 2,3,4 y 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; 
} 

me encontré con los números consecutivos a través de la matriz $ ss, empujando los valores cada vez que las filas $ [i] tiene un valor, si la longitud es mayor que 3 y rallador de la matriz más larga $, copie la matriz durante (Con concat()!), si no hay ningún valor, $ seq se restablece.

es tan simple una vez que sabes ...


edición me di cuenta que tenía un error tipográfico en el código

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

debería haber sido

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

+0

@Daniel. Puede usar las funciones incorporadas 'Math.max' y' Math.min', ya que aceptan los argumentos 'rest'. 'Math.max.apply (null, $ cards);' –

+0

También puede ordenar $ cards usando $ cards.sort() y luego tomar el primero y el último. – Nicholas

+0

este es un truco genial, no sabía de esto. Miré a casalib para ver cómo se hace eso (el más bajo) 'return inArray [inArray.sort (16 | 8) [0]];'. Tengo curiosidad de cómo se compara con Math.min – Daniel

2

Desea ordenar sus valores y reemplazar todos los duplicados con una matriz de ellos mismos. es decir.

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

Luego querrá encontrar la mayor secuencia consecutiva y eliminar las infracciones.

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

Luego será una cuestión de multiplicar la longitud de todas sus matrices para encontrar su puntaje.

Una vez que haya limpiado su matriz, puede pensar en la fórmula de esta manera.

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; 

Debe ser muy divertido averiguar cómo escribir esto en el código.

+0

He llegado hasta aquí, simplemente no estoy seguro de cómo comprobar si la secuencia está en orden, voy a editar la publicación para mostrar lo que tengo hasta ahora (editar 1) – Daniel

+0

puedes usar array.sortOn para ponerlo orden. – Nicholas

+0

pero no me dice que el 9 es el que está fuera – Daniel

Cuestiones relacionadas