I würde Vorprozess das Array von jedem Subarray rotierenden so dass die Zahlen eine diagonale Linie up untereinander bilden. Erste Funktionen definieren ein einzelnes Array von n
Elemente in jede Richtung zu drehen:
const rotateLeft = (array, n) => array.slice(n).concat(array.slice(0, n));
const rotateRight = (array, n) => rotateLeft(array, -n);
und Funktionen jedes Sub-Arrays zu drehen, um Beträge in beiden Richtungen immer größer werdenden:
const rotateAllLeft = array => array.map(rotateLeft);
const rotateAllRight = array => array.map(rotateRight);
Ihr Array wird nun wie folgt aussehen mit den vertikal aufgereihten:
var array = [ [1, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 1, 0, 0],
[1, 0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0]
]
Das Problem ist jetzt auf das Finden vertikaler Linien von Einsen reduziert. Um dies zu tun, wird es am einfachsten sein, zuerst das Array transponieren, die Sie tun können, mit:
const transpose = array => array[0].map((_, i) => array.map(row => row[i]));
Wir werden nun eine kleine Funktion schreiben, die ein Array nimmt und gibt ein weiteres Array, dessen Werte die Länge von „läuft "von einem bestimmten Wert:
const run = (array, val, cnt = 0) => array.map(elt => cnt = elt === val ? ++cnt : 0;
Für [1, 1, 1, 1, 0, 0]
dies würde [1, 2, 3, 4, 0, 0]
zurückzukehren. Die 4
zeigt einen Lauf von vier 1
Werten bis zu diesem Punkt an.
schreiben wenig Funktionen für einen Lauf eines bestimmten Wertes einer minimalen Länge in einem einzelnen Array zu testen, oder einen Lauf eines bestimmten Wertes einer minimalen Länge in jedem Sub-Array:
const hasRunOf = (array, val, n) => run(array, val).some(len => len >= n);
const hasAnyRunOf = (array, val, n) => array.some(subarray => hasRunOf(subarray, val, n));
Sie können jetzt Test auf das Vorhandensein von jedem Durchlauf von vier oder mehr solche mit
hasAnyRunOf(transpose(rotateAllLeft(array)), 1, 4) ||
hasAnyRunOf(transpose(rotateAllRight(array)), 1, 4)
die Informationen über genau Capturing wo erfolgte die diagonal Lauf als eine Übung gelassen wird.
könnte dieser Link hilfreich sein, um Sie http://stackoverflow.com/questions/21011011/multi-dimensional-array-check-for-diagonal-consecutive-values – Geeky
was bist du erwartet der Rückgabewert in diesem Beispiel? – jjenzz