2017-11-13 3 views
0

Ich habe ein Array (2d-Matrix), und ich mag die x/y-Werte für die(Javascript - Arrays) Get ganz links und ganz rechts angeschlossener Charakter

  • meist links & oben kommen verbunden '1'-Charakter
  • meisten rechts & Boden verbunden' 1'-character

EDIT 2.0:

Ich rufe meine Funktion mit den Parametern x/y, das sind die Koordinaten meines Start-'1'-Zeichens.

10001 
00001 
11111 
01110 --> (x: 1, y: 3) 

Und meine Funktion überprüft die Spalte oben & und die Spalte rechts so, wenn es ein Zeichen ‚1‘ zählt x oder y (wo die Spalte gefunden wurde) und 1.


My-Funktion an einem bestimmten Punkt beginnt (zB y: 2, x: 0)


var array = [ 
'00000', 
'01111',  --> get position of the most top & right '1'-character (x: 4, y: 1) 
'11000', 
'00000' 
] 

Dies ist der functio n erhält das rechte oberes Ende von ‚1'-Zeichen:

var array = [ 
 
'00000', 
 
'01111',  
 
'11000', 
 
'00000' 
 
] 
 
    
 
    
 
    Array.prototype.get_top_right = function(x_pos, y_pos) { 
 
    var matrix = this, y1= y_pos; 
 
    for (var x1 = x_pos; x1 < this[0].length; x1++) { 
 
     try { 
 
     if (matrix[(y1-1)][x1] == '1') y1--; 
 
     else if (matrix[y1][(x1+1)] != '1') break; 
 
     } catch(e) {} 
 
    }; return [x1,y1] 
 
} 
 
    
 
var result=array.get_top_right(0,2) 
 
    
 
console.log(result)

Ok. Die obige Funktion scheint gut zu funktionieren, aber jetzt möchte ich den Prozess umkehren, um das letzte links unten verbundene '1'-Zeichen meiner Matrix/2D-Matrix zu erhalten.

var array = [ 
    '00000', 
    '01111',  
    '11000', --> get position of the most bottom & left '1'-character (x: 0, y: 2) 
    '00000' 
] 

Ich habe keine Ahnung, wie die Funktion oben zu bearbeiten, um das linke & unten Spiel als Ergebnis zu erhalten statt dem am weitesten rechts & Topspiel wie Sie oben sehen können.

Edit 1.0 Meine Funktion, die ich bis noch codiert habe nicht funktioniert, sondern sieht wie folgt aus:

Array.prototype.get_bottom_left = function(x_pos, y_pos) { 
    var matrix = this, y2= y_pos; 
    for (var x2 = x_pos; x2 > 0; x2--) { 
     try { 
     if (matrix[(y2+1)][x2] == '1') y2++; 
     if (matrix[y2][(x2-1)] != '1') break; 
     } catch(e) {} 
    }; return [x2,y2] 
} 

Mit dieser Funktion oben und die error_array unter den Boden bekommen links verbunden Charakter Das Array führt zu einem Absturz des Browsers. Nett!

var error_array = [ 
    '000000', 
    '000011', 
    '111110', 
    '111111' 
    ] 

Ich hoffe jedoch, jemand mir meine Funktion zu aktualisieren helfen kann ...

Dank einer Million im Voraus,
Grüße - hans.

+1

ich, dass ich diese Frage gleich gestern hätte schwören können, sah, aber jetzt ist es nirgends zu finden, sich vorstellen, dass. – James

+0

Ok. Klingt verrückt, also wenn du die Frage findest, wäre es super nett, wenn du mir den Link für die Frage liefern könntest. Vielen Dank! –

+0

Ist die Zeichenfolge immer 5 Zeichen? – zfrisch

Antwort

0

I erstellt zwei Versionen von get_bottom_left Methode:

  • bottom_left_up die Verfahrgeschwindigkeit von (x, y) nach links zeigen und auf die oben
  • bottom_left_down die Verfahrgeschwindigkeit von (x, y) auf den Punkt rechts und nach unten.

Hier ist die Umsetzung:

Array.prototype.bottom_left_up = function(x, y) { 
    if(this[y][x] === '0') { 
    return; 
    } 
    while(y >= 0) { 
    while(--x >= 0) { 
     if(this[y][x] === '0') { 
     return [x + 1, y]; 
     } 
    } 
    if(--y === -1 || this[y][this[y].length - 1] === '0') { 
     return [0, y + 1]; 
    } 
    x = this[y].length; 
    } 
}; 

Array.prototype.bottom_left_down = function(x, y) { 
    if(this[y][x] === '0') { 
    return; 
    } 
    while(y < this.length) { 
    if(this[y].indexOf('0', x) !== -1) { 
     return [x, y]; 
    } 
    if(++y === this.length || this[y][0] === '0') { 
     return [x, y - 1]; 
    } 
    x = 0; 
    } 
}; 

Sie sehen, gibt es keine Out-of-Range-Schutz, könnte es ohne Probleme separat hinzugefügt werden. Lassen Sie uns die Logik testen:

var array = [ 
'00000', 
'01111', 
'11000', 
'00000' 
]; 
console.log(array.bottom_left_up(2, 1)); // [1, 1] 
console.log(array.bottom_left_down(2, 1)); // [0, 2] 

var array2 = [ 
    '000000', 
    '000011', 
    '111110', 
    '111111' 
]; 
console.log(array2.bottom_left_up(3, 3)); // [0, 3] 
console.log(array2.bottom_left_down(3, 3)); // [3, 3] 

In Bezug auf Methoden Schutz, ich würde try-catch nicht verwenden, würde ich vorschlagen, so etwas wie:

function(x, y) { 
    x = parseInt(x, 10); 
    y = parseInt(y, 10); 
    if(!this.length || isNaN(x) || isNaN(y) || x < 0 || y < 0 || x >= this.length || y >= this[0].length) { 
    return; 
    } 
    // ... 
} 

So werden Sie 'undefined' in 3 Fällen erhalten: leeres Array, schlecht Params, nicht gefunden.

+0

Sie haben absolut Recht mit dem Versuch, Teil & 1 zu fangen. - Danke für Ihren Code, aber das ist nicht gerade das Ergebnis, das ich gerne bekommen würde. Meine Startparameter (x/y) befinden sich in einem Index, der ein '1' Zeichen hat. ---------> Dies ist das Ergebnis, das ich erhalten möchte, wie ich in der Funktion in meiner Frage oben erwähnt habe: 'var array = [ '00000', '01111', ' 11000 ', ' 00000 ' ] ' ' console.log (array.top_right (0, 2)); // -> [4,1] ' ' console.log (array.bottom_left (2, 1)); // [0, 3] ' –

+0

@ pete234 Entschuldigung, ich habe die Anforderungen nicht richtig verstanden. Selbst jetzt bin ich mir nicht sicher ... Übrigens habe ich meine Antwort aktualisiert und zwei verschiedene Versionen für die Methode "get_bottom_left" zur Verfügung gestellt. Sie durchlaufen eine Matrix in verschiedene Richtungen: links + unten und rechts + oben. Die gleiche Logik könnte für die Methode "get_top_right" wiederholt werden. – dhilt

-1

Hier ist eine Funktion, die den Trick mit jeder Größe einer Matrix zu tun scheint, aber ich bin mir nicht ganz sicher, ob Sie immer die erste "1" in der Matrix finden wollten, auch wenn es alleine auf der Linie und war auf der rechten Seite .. Ihre Arrays als Testparameter Mit

var array = [ 
    '00000', 
    '01111',  
    '11000', 
    '00100']; 

var error_array = [ 
    '000000', 
    '000011', 
    '111111', 
    '111111', 
    '000000', 
    '000010', 
    '100000' 
    ] 


getLeftBottom(error_array); 

function getLeftBottom(testArray) 
{ 
    var firstFound; 
    for (var index = testArray.length; index > 0; index--) 
    { 
     console.log(testArray[index-1]); 
     str = testArray[index-1]; 
     firstFound = str.indexOf("1"); 
     if (firstFound !== -1) 
     { 
      console.log("Coordinates: x = {0}, y = {1}", firstFound, index) // Apparently this doesn't work as I expected in JS but you can still see the coordinates 
      break; 
     } 

    } 
} 
Verwandte Themen