2016-05-19 22 views
0

数値値からピラミッド配列を作成しようとしています。要件は、私の場合、5列の3行を持つ配列から作業することです。下の例のようなピラミッドを作成する必要があります。ここでJavascript - 数値からピラミッド配列を作成する

は、これまでのところ私のコードは次のようになります..私は正確に達成したいものを

[0, 0, 1, 0, 0] 
[0, 1, 1, 1, 0] 
[1, 1, 1, 1, 1] 

..です

var a = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]; 
 

 
function array_pyramid(array){ 
 
    for (i = 0; i < array.length; i++){ 
 
     for (j = 0; j <= Math.floor(array[i].length/2); j++){ 
 
      var tmp = array[i].length/2; 
 
      console.log (Math.floor(tmp)); 
 
      if (i < j) { 
 
       array[i][j] = 1; 
 
      } 
 
     } 
 
    } 
 
    return array; 
 
} 
 

 
function print_array(array) { 
 
    for (var i = 0; i < array.length; i++) { 
 
     console.log(array[i]); 
 
    } 
 
} 
 

 
//console.log(a); 
 
//print_array(a); 
 
print_array(array_pyramid(a));

+3

希望の結果の2番目の行が0ではなく1で始まるはずですか? – JAAulde

+0

私の悪い(誤字)の2行目は0から始まるべきである – Eow

+0

あなたの質問を編集する必要があります@Eow –

答えて

0

これはおそらくほとんどのため失敗します。他のケースで考え出すこともできますが、この具体的な例では動作します:

function array_pyramid(array){ 
    var mid = Math.floor(array[0].length/2); 
    for(var i=0;i<array.length;i++){ 
     for(var j=0;j<array[i].length;j++){ 
     var boundsLower = mid-i; 
     var boundsUpper = mid+i; 
     if(j>=boundsLower && j<=boundsUpper){ 
      array[i][j] = 1; 
     } 
     } 
    } 
    return array; 
} 

ライブ例:https://jsfiddle.net/o6t1cbdu/

+0

Brilliant!私はそれが多かれ少なかれ実行されないことを認識していますが、これはまさに私が本当の問題に論理を渡す必要があったものです。とても有難い! – Eow

0

function array_pyramid(array){ 
    var limit = [0,0]; 
    for (var i = array.length - 1, limit = [0, (array[0] || []).length - 1]; i >= 0; i--) { 
     for (var j = limit[0]; j <= limit[1]; j++) { 
      array[i][j] = 1; 
     } 
     limit[0]++; limit[1]--; 
    } 
    return array; 
} 

...これを試してみてください、私はそれはあなたが同様に、内側と外側のループで正しい軌道を下に始めていた

0

を役に立てば幸い中点を説明しようとする部門の使用として。

ここでその列の任意の数のアカウント(奇数又はも)コードの冗長および高コメント変形例である及び1又は0であるべき列を決定するために行の進行中に広がる範囲を使用します。私は第2の配列bを含んでいます。これは、偶数列カウントでも動作することを示しています。

var a = [ 
 
     [0, 0, 0, 0, 0], 
 
     [0, 0, 0, 0, 0], 
 
     [0, 0, 0, 0, 0] 
 
    ], 
 
    b = [ 
 
     [0, 0, 0, 0, 0, 0], 
 
     [0, 0, 0, 0, 0, 0], 
 
     [0, 0, 0, 0, 0, 0] 
 
    ]; 
 

 
function array_pyramid (a) { 
 
     // Use first row to determine row length, assume all others are the same 
 
    var base_length = a[0].length, 
 
     // Get a modulus to account for odd or even row length 
 
     mod = base_length % 2, 
 
     // Find the middle point 
 
     mid_point = Math.floor(base_length/2) + mod, 
 
     // Account for zero-index of arrays 
 
     zero_indexed = mid_point - 1, 
 
     // Produce an initial set of boundaries 
 
     marker_range = { 
 
      lower: zero_indexed, 
 
      upper: (mod === 1) ? zero_indexed : (zero_indexed + 1) 
 
     }; 
 

 
    // Iterate the array's rows 
 
    a.forEach(function (row) { 
 
     // Iterate the row's cols 
 
     row.forEach(function (col, i) { 
 
      // Compare index to boundaries to determine if we're outputting a 1 or a 0 
 
      row[i] = (i >= marker_range.lower && i <= marker_range.upper) ? 1 : 0; 
 
     }); 
 

 
     // If we still have room to expand, widen the range in each direction 
 
     if (marker_range.lower > 0) { 
 
      marker_range.lower -= 1; 
 
      marker_range.upper += 1; 
 
     } 
 
    }); 
 

 
    return a; 
 
} 
 

 
function print_array(a) { 
 
    var i; 
 

 
    console.log('-- Start output'); 
 

 
    for (i = 0; i < a.length; i++) { 
 
     console.log(' ', a[i]); 
 
    } 
 

 
    console.log('-- End output'); 
 
    console.log(' '); 
 
} 
 

 
console.log('a (odd col count):'); 
 
print_array(array_pyramid(a)); 
 

 
console.log('b: (even col count)'); 
 
print_array(array_pyramid(b));

1

以下の例を試してみてください。私は意図的に変数名を長く記述的に保ち、解析の容易さのためにインラインではなく複数のステップで操作を保持しました。

var a = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]; 
 

 
function array_pyramid(array){ 
 
    var pBlocksCount = 1; 
 
    var currentRow, rowIndex, columnIndex, columnsCount, rowsCount = array.length; 
 
    for(rowIndex=0; rowIndex<rowsCount; rowIndex++){ 
 
     currentRow = array[rowIndex]; 
 
     columnsCount = currentRow.length; 
 

 
     var piramidDrawIndex = parseInt(columnsCount/2); 
 
     var piramidDrawOffset = parseInt(pBlocksCount/2); 
 
     var piramidDrawTrigger = piramidDrawIndex-piramidDrawOffset; 
 
     var blocksToDraw = pBlocksCount; 
 

 
     for(columnIndex=0; columnIndex<columnsCount; columnIndex++){ 
 
      if(columnIndex>=piramidDrawTrigger){ 
 
       if(blocksToDraw){ 
 
        currentRow[columnIndex]=1; 
 
        blocksToDraw--; 
 
       } 
 
      } 
 
     } 
 
     pBlocksCount+=2; 
 
    } 
 
    return array; 
 
} 
 

 

 
function print_array(array) { 
 
    for (var i = 0; i < array.length; i++) { 
 
     console.log(array[i]); 
 
    } 
 
} 
 

 
print_array(array_pyramid(a));

0

だからここにそれが正常に動作し、私のコードです。 考え方は、行列の主垂直中心を見つけ、sideAとsideB変数がピラミッドの左右を表すことです。あなたが側面を見つけたら、あなたはそれらを1つに、そしてそれらの間の全てと同等にします(if (j <= sideA && j >= sideB))。私はそれが助けて欲しい:)あなたは、コンソールでそのコードを実行すると

function array_pyramid (array) { 
    var item, sideA, sideB; 

    if (array instanceof Array) { 
     for (var i = 0; i < array.length; i++) { 
      item = array[i]; 
      centerIndex = Math.floor(item.length/2); 
      sideA = centerIndex + i; 
      sideB = centerIndex - i; 

      for (var j = 0; j < item.length; j++) { 
       if (j <= sideA && j >= sideB) { 
        item[j] = 1; 
       } 
      } 
     } 

     return array; 

    } else { 
     return 'Invalid array'; 
    } 
} 

array_pyramid ([ 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
]); 

それはこの返します。

[0, 0, 1, 0, 0] 
[0, 1, 1, 1, 0] 
[1, 1, 1, 1, 1] 

をそして、それはそれです。

関連する問題