Computer >> Máy Tính >  >> Lập trình >> Javascript

Làm thế nào để thực hiện Butterfly Shuffle trong JavaScript?

Mảng xáo trộn hình cánh bướm trong JavaScript là một mảng Số được sắp xếp sao cho các số giảm dần khi chúng ta tiến đến trung tâm của mảng và tăng lên khi chúng ta đến gần cuối mảng. Con số lớn nhất được đặt ở chỉ mục đầu tiên.

Một biến thể khác của mảng xáo trộn hình bướm là nơi các con số tăng dần về phía trung tâm và giảm dần về cuối. Trong trường hợp này, số nhỏ nhất được đặt ở chỉ mục đầu tiên.

Đối với những người xuất thân từ nền tảng Toán học, nó có phần liên quan đến Guassiandistribution.

Ví dụ

Giả sử chúng ta có mảng này -

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

Nếu chúng ta áp dụng tính năng xáo trộn bướm cho nó, đầu ra sẽ là -

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

Xem cách các số lớn nhất và lớn nhất thứ hai được đặt ở các đầu cực và số nhỏ nhất ở giữa.

Một khả năng khác có thể là -

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

Công việc của chúng ta là viết một hàm lấy một mảng Numbers và một chuỗi làm đối số thứ hai, chuỗi có thể nhận bất kỳ giá trị nào trong hai giá trị ‘asc’ hoặc ‘des’. -

  • Nếu chuỗi là 'des' thì chúng ta phải xáo trộn mảng theo thứ tự tăng dần.

  • Nếu đó là 'asc' thì chúng ta phải xáo trộn mảng theo thứ tự giảm dần đến tăng dần.

Phương pháp tiếp cận

  • Nếu chuỗi là 'asc', ban đầu chúng ta sắp xếp mảng theo thứ tự tăng dần, ngược lại theo thứ tự giảm dần. Vì vậy, hãy xem xét hàm đã được gọi với ‘asc’, thì mảng bây giờ sẽ giống như -

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • Sau đó, chúng tôi chia mảng thành hai mảng sao cho các phần tử liền kề được phân phối trong các mảng đối lập. Chúng tôi đẩy các phần tử trong một mảng trong khi chúng tôi chuyển chúng sang mảng khác, để một mảng được đảo ngược mà không cần chúng tôi thực hiện việc này theo cách thủ công.

Hai mảng được hình thành do đó sẽ trông giống như -

[ 0, 2, 4, 6, 8 ] [ 9, 7, 5, 3, 1 ]
  • Bây giờ bước cuối cùng là nối các mảng này và sau đó chúng ta sẽ nhận được mảng cần thiết của mình. Tất cả những thứ này khi được đưa vào mã sẽ trông giống như thế này -

Ví dụ

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'));

Đầu ra

Đầu ra trong bảng điều khiển sẽ là -

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