[Codility Lessons] 2. Arrays - CyclicRotation


に答える
  • 配列要素に近い理解,数学的法則が見つかれば,式で解くことができる.
  • の精度だけが重要であれば、一番前の要素を後ろに押して、前の要素の外でsliceを繰り返し解決することもできます.しかしこのとき,操作配列の演算は性能的に小さくないと思うので,それを一つの方法にした.
  • の数学式を見つけるのは容易ではない場合は、すぐに配列相関関数を使用して解決することが望ましい.
  • length-1*Vをコアとし、回転時に以下の値を見つけます.lengthで-1は、グリッドを移動するためです.1がなければ移動せず、自分の価格を呼ぶことになります.-2の場合は、2マス回転します.
  • /*
        [1, 2, 3, 4]
        length: 4
        
        V(K % length)  index   value   answer
        1               0       N[3]    (index  + length -1 * V) % length
        1               1       N[0]    
        1               2       N[1]    
        1               3       N[2]    
        
        2               0       N[2]    (index  + length -1 * V) % length
        2               1       N[3]    
        2               2       N[0]    
        2               3       N[1]    
        ...
        
    */
    
    function solution(A, K) {
      const V = K % A.length;
    
      const answer = A.map(
        (_, index) => A[(index + (A.length - 1) * V) % A.length],
      );
    
      return answer;
    }
    回転ギャップ可変アレイ回転関数
    https://gist.github.com/doong-jo/197d6fe48697fed16bc5d95ae60244cd
    /**
     * Rotate array
     * @param {number[]} A target number array (ex. [1, 2, 3, 4])
     * @param {number} K rotate count
     * @param {number} D rotate distance
     */
    function rotateArray(A, K, D = 1) {
      const V = ((A.length - D) * K) % A.length;
    
      return A.map((_, index) => A[(index + V) % A.length]);
    }
    
    const r1 = rotateArray([1, 2, 3, 4], 1, 1);
    const r2 = rotateArray([1, 2, 3, 4], 2, 4);
    const r3 = rotateArray([1, 2, 3, 4], 1, 2);
    const r4 = rotateArray([1, 2, 3, 4], 1, 4);
    
    console.log(r1); // [ 4, 1, 2, 3 ]
    console.log(r2); // [ 1, 2, 3, 4 ]
    console.log(r3); // [ 3, 4, 1, 2 ]
    console.log(r4); // [ 1, 2, 3, 4 ]