snail


Codewars解答


snail問題

n x n配列が与えられた場合、最も外側の要素から時計回りに移動し、中間要素として配列された配列要素を返します.
Example1:
array = [[1,2,3],
         [4,5,6],
         [7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]
Example2:
array = [[1,2,3],
         [8,9,4],
         [7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]

に注意
  • は、要素を最小値から最高値にソートするものではありません.2 Dアレイを時計回りに通過します.
  • 0 0 x 0(Null Matrix)は、アレイ内部のNullアレイ[]として表示される.
  • 私の答え


    パターン解析


    例として、4 x 4配列値[[1, 2, 3, 1],[4, 5, 6, 4],[7, 8, 9, 7],[7, 8, 9, 7]]snail関数の因数伝達として考慮する.
    返却が必要な価格は[1, 2, 3, 1, 4, 7, 7, 9, 8, 7, 7, 4, 5, 6, 9, 8]です.
  • の最初の、配列の最初の要素、すなわち4 x 1行は、それを順番に保持して移動し、新しい配列に入れます.(ソースアレイは4 x 3)
  • の2番目は、外配列要素に重なる内配列の最後の要素をそれぞれ取り出し、新しい配列に入れる.(ソースアレイは3 x 3)
  • 3番目、配列の3番目の要素、すなわち3 x 3行を反転して取り出し、新しい配列に入れる.(ソースアレイは3 x 2)
  • の4番目は、外側の配列を反転させ、要素に重なる内側の配列の1番目の要素をそれぞれ取り出して新しい配列に入れます.(ソースアレイは2 x 2)
  • 以降、最初のプロセスが繰り返される.
  • これを画像で表現すると、次のようになります!

    コードの作成

    const snail = (array) => {
      const resultArray = [];
      if (array.length == 1 || array.length == 0)
        resultArray.push(...array.shift());
      while (array.length) {
        resultArray.push(...array.shift());
        array.forEach((row) => resultArray.push(row.pop()));
        array
          .pop()
          .reverse()
          .forEach((item) => resultArray.push(item));
        array.reverse().forEach((row) => resultArray.push(row.shift()));
        array.reverse();
        if (array.length == 1) resultArray.push(...array.shift());
      }
      return resultArray;
    };
  • 配列を因数とする式関数snailを生成する.
  • の結果を含む空の配列resultArray変数を生成する.
  • 配列長が
  • または1の場合、0の配列は形成されないため、spred構文を使用してn x nに戻されます.
  • モード解析の最初の係数伝達配列の最初の要素として、配列のresultArray法を用いて抽出した.
    次いで、shift()法を用いてpush()に入れる.resultArrayメソッドで元の配列が変更されたため、元の配列の最初の行は現在消えています.
  • パターン解析の2番目は、shift()法を使用して残りのソース配列中の要素を行単位で循環させる.forEach()法を使用して、コールバック関数に渡される行rowの最後尾要素を抽出する.pop()メソッドを使用して、push()メソッドが返す値をpop()に入れます.resultArrayメソッドも元の配列を変更したため、残りの元の配列では右端の列も消えてしまった.
  • モード解析の3番目の方法は、pop()法を用いて残りのソース配列の最後の行を選択する.
    右から左に移動する順序なので、pop()メソッドで返される行の順序をpop()に逆さにします.reverse()の方法を使用して、反転順序の最後の行の各要素をforEach()resultArrayに入れる.push()メソッドを使用して元のスキーマを変更したため、残りの元のスキーマの一番下の行は消えました.
  • パターン解析の4番目は、残りの元の配列にネストされた配列の一番前の要素を選択するが、順序は下から上へ移動するので、pop()で2行の上、下の順序を変更する.reverseメソッドでコールバック関数に渡された行の最初の要素からforEach()メソッドを減算し、shift()resultArrayを減算します.
  • 以降、前の手順が繰り返されます.
    このため、7番から逆さになった原列をpush()に並べ替えた後、reverse()ゲートを通って長さwhileになるまで繰り返し並べ替えます.
    このとき,最終到着時の配列の長さが0であれば,1つの要素しか残っていないので,1文を再ループする必要はなく,最後の要素を入れるだけで終了する.
  • が完了したwhile変数の配列値を返します.
  • 他人を解く


    buttonupbub (plus 67 more warriors)
    function snail(array) {
      var vector = [];
      while (array.length) {
        vector.push(...array.shift());
        array.map(row => vector.push(row.pop()));
        array.reverse().map(row => row.reverse());
      }
      return vector;
    }
  • の結果を含む空の配列resultArrayが生成される.
  • 2vector法を使用して、元の配列の最初の行要素をshift()配列に入れる.
  • ソース配列をvectorメソッドでソース配列の要素行をループし、行のmap()メソッドで最後の要素を除去し、pop()配列に戻り値を入れます.
  • ここには私のように順番にパスを移動して、要素を排除しないで、驚くべき解決方法があります!
    モードの3番目から、実際には、行を逆さまにすると、行中の要素の順序も逆さまになり、モードの1番目から再適用され、vectorモードパスの順序と同じになります!
    下図で説明しました.

    つまり、snailパスは「ㄱ」の字で連続的に実現できます!驚かない?!
  • codeWarsは問題を解いた後に他の人の答えを見ることができて、私の知らない方法を勉強して、本当に面白いです!
    このように問題を解決し続け、解決策の視野を広げ、より効果的に解決しようと努力する.