Tengo una matriz de objetos que se almacenan (Secuencias) como una matriz en javascript como

Matriz = [A, G, G, A, G, A, A, G, G, G, A, A, G, G]

¿Cómo diseño un algoritmo y lo implemento en javascript para que vayan a las posiciones como se muestra en la imagen a continuación?

Image

Decir placeAtTop ('A') colocará A en la parte superior Decir placeAtBottom ('G') colocará G en la parte inferior

Cada vez que se encuentra A de izquierda a derecha, debe ir a placeAtTop () y cada vez que se analiza G, debe ser placeAtBottom () de izquierda a derecha secuencialmente.

EDITAR:

El resultado esperado son las funciones callof

// create new page

placeAtTop('A')
placeAtBottom('G')
placeAtBottom('G')

// create new page

placeAtTop('A')
placeAtBottom('G')

// create new page

placeAtTop('A')

// create new page

placeAtTop('A')
placeAtBottom('G')
placeAtBottom('G')
placeAtBottom('G')

// create new page

placeAtTop('A')

// create new page

placeAtTop('A')
placeAtBottom('G')
placeAtBottom('G')
-1
Code Guy 27 oct. 2017 a las 18:03

4 respuestas

La mejor respuesta

Pasos, algorítmicamente:

  • crear una nueva matriz, llamémosla newArray, que será bidimensional
  • iterar sobre la primera matriz
    • para cada elemento de la matriz, si es A, cree una nueva matriz, presione A sobre ella y agréguela a newArray
    • si es G, empújelo al último subArray de newArray

Esto terminaría con una matriz que se parece a

[[A, G, G], [A, G], [A],[A, G, G, G] [A] [A, G, G]] 

Y así sucesivamente.

1
Technophobe01 27 oct. 2017 a las 16:32

Puede crear una matriz de matrices basadas en A y luego agregarlas a la tabla donde cada primer elemento será A y agregarlas a thead y otros elementos son G y los agrega a tbody.

var arr = ["A", "G", "G", "A", "G", "A", "A", "G", "G", "G", "A", "A", "G", "G"]

var i = 0
var r = arr.reduce(function(r, e, j) {
  if (e == 'A' && j != 0) i++;
  if (!r[i]) r[i] = []
  r[i].push(e)
  return r;
}, [])

var thead = document.querySelector('thead tr');
var tbody = document.querySelector('tbody tr');

r.forEach(function(e, i) {
  thead.innerHTML += '<th>' + e[0] + '</th>';
  tbody.innerHTML += '<td>' + e.slice(1).map(e => e + '<br>').join('') + '</td>';
})
td {border: 1px solid black;}
<table>
  <thead><tr></tr></thead>
  <tbody><tr></tr></tbody>
</table>
2
Nenad Vracar 27 oct. 2017 a las 15:19

Puede usar Array#reduce que devuelve la última matriz fopr insertando 'A' letras siguientes.

var array = ['A', 'G', 'G', 'A', 'G', 'A', 'A', 'G', 'G', 'G', 'A', 'A', 'G', 'G'],
    result = [];
    
array.reduce(function (r, a) {
    if (a === 'A') {
        r = [a];
        result.push(r);
    } else {
        r.push(a);
    }
    return r;
}, null);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 27 oct. 2017 a las 20:02

Quizás es una opción para usar una expresión regular, capturar los grupos, hacer un bucle de los grupos y luego, por grupo, hacer un bucle de las letras. la primera letra será la 'A' y el resto será una 'G'

Por ejemplo:

var values = [ 'A', 'G', 'G', 'A', 'G', 'A', 'A', 'G', 'G', 'G', 'A', 'A', 'G', 'G' ];
var str = values.join('');
var regex = /(AG*)+?/g;
var groups = str.match(regex);
for (var i = 0; i < groups.length; i++) {
    // the groups[i] contains [A,G,G] etc..
    for (var j = 0; j < groups[i].length; j++) {
        if (j === 0) {
            console.log("placeAtTop(" +groups[i][j] + ");")
        } else {
            console.log("placeAtBottom(" +groups[i][j] + ");")
        }
    }
}
3
The fourth bird 27 oct. 2017 a las 15:52