each_cons() - 루비
each_cons() enumerable 메소드는 매번 각 요소에서 시작하여 연속적인 N 요소를 반복하는 Ruby의 내장 메소드입니다. 블록이 주어지지 않으면 열거자를 반환합니다.
each_cons()에 해당하는 JS
Number 리터럴의 배열(이 경우 Ruby의 열거 가능한 JS와 동일)이 있다고 가정하면 each_cons 함수는 배열의 각 요소에 대해 실행되고 숫자 N(N <=배열의 길이)을 다음과 같이 받아들이는 Array 함수여야 합니다. 유일한 주장. 모든 요소에서 하나씩 시작하는 각 하위 배열과 함께 크기가 N인 하위 배열이 있는 배열을 반환합니다.
이에 대한 예를 보면 상황이 좀 더 명확해집니다.
다음과 같은 배열이 있다고 가정합니다 -
const arr = [1, 2, 3, 4, 5]; console.log(arr.eachCons(2));
eachCons에 대한 이 호출이 하는 일은 각각 다음과 같은 2개의 요소가 있는 배열의 배열을 형성한다는 것입니다. -
[[1, 2], [2, 3], [3, 4], [4, 5]]
할 수 있을 때까지 원본 배열의 각 요소에 대해 하위 배열이 생성됩니다.
N 값이 2가 아닌 3이었다면 결과는 다음과 같았을 것입니다. -
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
다시 말하지만, 배열에 요소가 충분할 때까지 배열의 모든 요소에 대해 하위 배열이 생성됩니다.
접근
이 문제를 해결하기 위해 슬라이딩 윈도우 알고리즘을 사용할 것입니다.
현대 ES6 기능을 사용하여 두 줄로 이 문제를 해결할 수 있지만 전자의 접근 방식은 후자에 비해 매우 효율적입니다.
먼저, 0에서 N 인덱스까지의 초기 창을 생성하는 while 루프를 사용할 것입니다. 그 다음에. 창의 끝이 여전히 원래 배열의 길이보다 짧은 동안 실행되는 for 루프를 사용할 것입니다.
이 루프는 창의 안정성을 확인합니다(즉, 창의 길이가 N과 동일함). 창이 안정적인 경우 창(결과 배열에 해당 하위 배열)을 삽입하고 단위 거리만큼 오른쪽으로 밉니다. 그것을 접습니다(즉, 시작 =끝). 창이 불안정하면 계속 요소를 추가합니다.
이 접근 방식의 코드는 -
예시
const arr = [1, 2, 3, 4, 5]; const eachCons = function(num){ let res = [], temp = []; let start = 0, end = 0; while(end < num){ temp.push(this[end++]); }; for(; end <= this.length ;){ if(temp.length === num){ res.push(temp); start++; end = start; temp = []; } temp[end-start] = this[end]; end++; } return res; }; Array.prototype.eachCons = eachCons; console.log([1, 2, 3, 4, 5].eachCons(1)); console.log([1, 2, 3, 4, 5].eachCons(2)); console.log([1, 2, 3, 4, 5].eachCons(3)); console.log([1, 2, 3, 4, 5].eachCons(4));
출력
콘솔의 출력은 다음과 같습니다. -
[ [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ] ] [ [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 4, 5 ] ] [ [ 1, 2, 3 ], [ 2, 3, 4 ], [ 3, 4, 5 ] ] [ [ 1, 2, 3, 4 ], [ 2, 3, 4, 5 ] ]