Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript에서 나비 셔플을 수행하는 방법은 무엇입니까?

<시간/>

JavaScript의 나비 셔플 배열은 배열의 중심에 접근하면 숫자가 감소하고 배열의 끝에 접근하면 증가하도록 정렬된 숫자 배열입니다. 가장 큰 숫자는 첫 번째 색인에 배치됩니다.

나비 셔플 배열의 또 다른 변형은 숫자가 중앙으로 증가하고 끝으로 갈수록 감소하는 경우입니다. 이 경우 가장 작은 숫자가 맨 처음 인덱스에 배치됩니다.

수학 배경을 가진 사람들에게 이것은 Guassiandistribution과 어느 정도 관련이 있습니다.

이 배열이 있다고 가정합니다 -

const arr = [8,2,6,3,9,1,4,5,0,7];

나비 셔플을 적용하면 출력은 -

가 됩니다.
[9, 7, 5, 3, 1,0, 2, 4, 6, 8]

가장 큰 숫자와 두 번째로 큰 숫자가 양 끝단에 어떻게 배치되고 가장 작은 숫자가 중앙에 배치되는지 확인하세요.

또 다른 가능성은 -

[0, 2, 4, 6, 8, 9, 7, 5, 3, 1]

우리의 임무는 숫자 배열과 문자열을 두 번째 인수로 받는 함수를 작성하는 것입니다. 문자열은 'asc' 또는 'des' 두 값 중 하나를 사용할 수 있습니다. -

  • string이 'des'이면 배열을 오름차순에서 내림차순으로 섞어야 합니다.

  • 'asc'인 경우 배열을 내림차순에서 오름차순으로 섞어야 합니다.

접근

  • 문자열이 'asc'이면 처음에 배열을 오름차순으로 정렬하고 그렇지 않으면 내림차순으로 정렬합니다. 따라서 함수가 'asc'로 호출되었다고 가정하면 배열은 이제 −

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 그런 다음 배열을 두 개의 배열로 분할하여 인접한 요소가 반대 배열로 분산되도록 합니다. 한 배열의 요소를 밀어넣고 다른 배열의 요소를 이동 해제하여 수동으로 수행하지 않고도 한 배열이 반전되도록 합니다.

이렇게 형성된 두 개의 배열은 다음과 같습니다. -

[ 0, 2, 4, 6, 8 ] [ 9, 7, 5, 3, 1 ]
  • 이제 마지막 단계는 이러한 배열을 연결하고 그 후에 필수 배열을 얻는 것입니다. 이 모든 것을 코드에 넣으면 다음과 같이 보일 것입니다 -

예시

const array = [8,2,6,3,9,1,4,5,0,7];
const butterflyShuffle = (array, order = 'asc') => {
   //creating a new copy of array so that we dont mutate the original
array
   const arr = array.slice();
   //sorting ascending or descending based on the argument
   arr.sort((a, b) => order === 'asc' ? a-b : b-a);
   const first = [], second = [];
   //this variable will later help in determining which array is to be
reversed
   //and which one is to be concatenated to which
   //if length is even, it means that last element will go in second array
   //otherwise it will go in first array
   const isEven = arr.length % 2 === 0;
   for (let i = 0; i < arr.length; i++){
      if(i % 2 === 0){
         isEven ? first.push(arr[i]) : first.unshift(arr[i]);
         continue;
      };
      isEven ? second.unshift(arr[i]) : second.push(arr[i]);
   };
   return isEven ? second.concat(first) : first.concat(second);
};
console.log(butterflyShuffle(array));
console.log(butterflyShuffle(array, 'des'));

출력

콘솔의 출력은 -

[
   9, 7, 5, 3, 1,
   0, 2, 4, 6, 8
]
[
   0, 2, 4, 6, 8,
   9, 7, 5, 3, 1
]