Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

จะทำ Butterfly Shuffle ใน JavaScript ได้อย่างไร?


อาร์เรย์สับเปลี่ยนผีเสื้อใน JavaScript คืออาร์เรย์ของ Numbers ที่จัดเรียงเพื่อให้ตัวเลขลดลงเมื่อเราเข้าใกล้ศูนย์กลางของอาร์เรย์และเพิ่มขึ้นเมื่อเราเข้าใกล้จุดสิ้นสุดของอาร์เรย์ ตัวเลขที่ใหญ่ที่สุดอยู่ที่ดัชนีแรกสุด

อีกรูปแบบหนึ่งของอาร์เรย์สับเปลี่ยนผีเสื้อคือการที่ตัวเลขเพิ่มขึ้นไปทางกึ่งกลางและลดลงในตอนท้าย ในกรณีนี้ ตัวเลขที่น้อยที่สุดจะอยู่ที่ดัชนีแรกสุด

สำหรับผู้ที่มาจากพื้นฐานคณิตศาสตร์ อาจมีความเกี่ยวข้องกับ 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]

งานของเราคือการเขียนฟังก์ชันที่ใช้อาร์เรย์ของ Numbers และสตริงเป็นอาร์กิวเมนต์ที่สอง สตริงสามารถรับค่าใดค่าหนึ่งจากสองค่า 'asc' หรือ 'des' −

  • หากสตริงเป็น '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
]