อาร์เรย์ Butterfly shuffled ใน JavaScript คืออาร์เรย์ตัวเลขที่จัดเรียงโดยตัวเลขลดลงเมื่อเข้าใกล้กึ่งกลางอาร์เรย์ และเพิ่มขึ้นเมื่อเข้าใกล้ท้ายอาร์เรย์ ตัวเลขมากที่สุดวางที่ดัชนีแรกสุด
รูปแบบอีกแบบของ Butterfly shuffled array คือตัวเลขเพิ่มขึ้นเข้ากึ่งกลางและลดลงเข้าท้าย ในกรณีนี้ ตัวเลขน้อยที่สุดวางที่ดัชนีแรกสุด
สำหรับคนที่มาจากพื้นฐานคณิตศาสตร์ มันเกี่ยวข้องกับการแจกแจงแบบ Gaussian distribution
ตัวอย่าง
สมมติว่าเรามีอาร์เรย์นี้ −
const arr = [8,2,6,3,9,1,4,5,0,7];
ถ้าเราใช้ butterfly shuffling ผลลัพธ์จะเป็น −
[9, 7, 5, 3, 1,0, 2, 4, 6, 8]
ดูว่าตัวเลขมากสุดและมากสุดอันที่สองอยู่ปลายสุด และตัวเลขน้อยสุดอยู่กึ่งกลาง
ความเป็นไปได้อีกอย่าง −
[0, 2, 4, 6, 8, 9, 7, 5, 3, 1]
หน้าที่ของเราคือเขียนฟังก์ชันที่รับอาร์เรย์ตัวเลขและสตริงเป็นอาร์กิวเมนต์ที่สอง สตริงสามารถรับค่าได้สองค่า 'asc' หรือ 'des' −
ถ้าสตริงคือ 'des' เราต้อง shuffle อาร์เรย์ในลำดับเพิ่มขึ้นถึงลดลง
ถ้าเป็น 'asc' เราต้อง shuffle อาร์เรย์ในลำดับลดลงถึงเพิ่มขึ้น
วิธีการ
ถ้าสตริงคือ 'asc' เราจัดเรียงอาร์เรย์แบบเพิ่มขึ้นก่อน มิฉะนั้นแบบลดลง ดังนั้น ถ้าฟังก์ชันถูกเรียกด้วย 'asc' อาร์เรย์จะกลายเป็น −
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
เราแยกอาร์เรย์เป็นสองอาร์เรย์ โดยองค์ประกอบติดกันกระจายไปอาร์เรย์ตรงข้าม เรา push ในอันหนึ่ง unshift ในอีกอัน เพื่อให้อันหนึ่งกลับลำดับอัตโนมัติโดยไม่ต้องทำเอง
สองอาร์เรย์ที่ได้จะเป็น −
[ 0, 2, 4, 6, 8 ] [ 9, 7, 5, 3, 1 ]
ขั้นสุดท้ายคือ concat อาร์เรย์ทั้งสอง และหลังจากนั้นเราจะได้อาร์เรย์ที่ต้องการ โค้ดทั้งหมดจะเป็นแบบนี้ −
ตัวอย่าง
const array = [8,2,6,3,9,1,4,5,0,7]; const butterflyShuffle = (array, order = 'asc') => { // สร้าง copy ใหม่เพื่อไม่ให้ mutate อาร์เรย์ต้นฉบับ const arr = array.slice(); // จัดเรียง ascending หรือ descending ตามอาร์กิวเมนต์ arr.sort((a, b) => order === 'asc' ? a-b : b-a); const first = [], second = []; // ตัวแปรนี้ช่วยกำหนดว่าอาร์เรย์ไหนต้อง reverse และ concat ไหนก่อน // ถ้าความยาวคู่ หมายถึงองค์ประกอบสุดท้ายจะไปใน second array // มิฉะนั้นจะไปใน 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 ]