Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

วิธีทำ Butterfly Shuffle ใน JavaScript


อาร์เรย์ 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 ]