2017-03-03 42 views
5

Można znaleźć wiele odpowiedzi do „obracania kwadratowy dwuwymiarowej tablicy”, ale nie „obraca się non kwadrat dwa tablicy wymiarowe”, i choć niektóre odpowiedzi nie działają jak ten:Jak obracać niepodzielną dwuwymiarową tablicę dwukrotnie, aby uzyskać wszystkie możliwe obroty?

rotate(tab) {                
     return tab[0].map(function(col, i) {         
      return tab.map(function(lig) {         
       return lig[i];            
      })                
     });                 
    } 

tylko Pracują przy pierwszym obrocie. Jeśli znowu się obrócisz, powrócisz do pierwszej tablicy, co nie jest tym, czego chcę, chcę wszystkie 3 możliwe kombinacje tablicy obróconej o 90 '.

Odpowiedz

1

Możesz użyć długości tablicy do obliczenia nowych pozycji.

original left right 
-------- -------- -------- 
1 2 3 4 1  3 6 
4 5 6 5 2  2 5 
      6 3  1 4 

function rotateRight(array) { 
 
    var result = []; 
 
    array.forEach(function (a, i, aa) { 
 
     a.forEach(function (b, j, bb) { 
 
      result[bb.length - j - 1] = result[bb.length - j - 1] || []; 
 
      result[bb.length - j - 1][i] = b; 
 
     }); 
 
    }); 
 
    return result; 
 
} 
 

 
function rotateLeft(array) { 
 
    var result = []; 
 
    array.forEach(function (a, i, aa) { 
 
     a.forEach(function (b, j, bb) { 
 
      result[j] = result[j] || []; 
 
      result[j][aa.length - i - 1] = b; 
 
     }); 
 
    }); 
 
    return result; 
 
} 
 

 
var array = [[1, 2, 3], [4, 5, 6]]; 
 

 
console.log(rotateLeft(array)); 
 
console.log(rotateRight(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

tylko szybkie pytanie: Twój kod działa bez zarzutu ... dlaczego nie nazwać rotateLeft() dwa razy? –

+0

@OlivierPons, możesz to zrobić, na prawo, możesz zadzwonić do lewej trzy razy, ale lubię mieć obie strony do wyboru. –

0

Można użyć małą bibliotekę Pisałem w celu wsparcia operacji 2d siatki (https://github.com/klattiation/gridl). Obsługuje również rotację.

const arr = [ 
    [1, 2, 3], 
    [4, 5, 6], 
]; 
const rotatedArray = gridl(arr).rotate(1).data(); 

// rotatedArray would look like this: 
// [ 
//  [4, 1], 
//  [5, 2], 
//  [6, 3], 
// ] 

Można również obracać się w innych kierunkach cichych prościej:

gridl(data).rotate(1); // rotates 90 degrees 
gridl(data).rotate(2); // rotates 180 degrees 
gridl(data).rotate(3); // rotates 270 degrees 
gridl(data).rotate(-1); // rotates -90 degrees 
gridl(data).rotate(-2); // rotates -180 degrees 
gridl(data).rotate(-3); // rotates -270 degrees