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

การคำนวณการเรียงสับเปลี่ยน Josephus อย่างมีประสิทธิภาพใน JavaScript


ปัญหานี้ได้รับการขนานนามว่าเป็นเหตุการณ์ที่สำคัญที่สุดในชีวิตของนักประวัติศาสตร์โบราณ ฟัสฟุส ตามเรื่องราวของเขา เขาและทหาร 40 นายถูกขังอยู่ในถ้ำโดยชาวโรมันในช่วง การล้อม

ปฏิเสธที่จะยอมจำนนต่อศัตรู พวกเขากลับเลือกที่จะฆ่าตัวตายหมู่โดยพลิกผัน - พวกเขาสร้างวงกลมและดำเนินการฆ่าชายคนหนึ่งทุก ๆ สามคน จนกระทั่งเหลือชายคนสุดท้าย (และควรจะฆ่าตัวตายเพื่อยุติการกระทำ) )

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

เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่ส่งคืนการเรียงสับเปลี่ยนของโจเซฟัส

ใช้เป็นพารามิเตอร์ในอาร์เรย์เริ่มต้น/รายการของไอเท็มที่จะเรียงสับเปลี่ยนราวกับว่าพวกมันอยู่ในวงกลมและนับทุกๆ k ตำแหน่งจนไม่เหลือเลย

ตัวอย่างเช่น ด้วย n=7 และ k=3 josephus(7,3) ควรดำเนินการในลักษณะนี้

[1,2,3,4,5,6,7] − initial sequence
[1,2,4,5,6,7] => 3 is counted out and goes into the result [3]
[1,2,4,5,7] => 6 is counted out and goes into the result [3,6]
[1,4,5,7] => 2 is counted out and goes into the result [3,6,2]
[1,4,5] => 7 is counted out and goes into the result [3,6,2,7]
[1,4] => 5 is counted out and goes into the result [3,6,2,7,5]
[4] => 1 is counted out and goes into the result [3,6,2,7,5,1]
[] => 4 is counted out and goes into the result [3,6,2,7,5,1,4]

ดังนั้น ผลลัพธ์สุดท้ายของเราคือ −

josephus([1,2,3,4,5,6,7],3)==[3,6,2,7,5,1,4];

ตัวอย่าง

รหัสสำหรับสิ่งนี้จะเป็น −

const arr = [1, 2, 3, 4, 5, 6, 7];
const num = 3;
const helper = (n, k, i, map) => {
   if (map.hasOwnProperty([n, k, i]))
   return map[[n, k, i]];
   if (i === 1)
   return map[[n, k, i]] = (k − 1) % n;
   return map[[n, k, i]] =
   (k + helper(n − 1, k, i − 1, map)) % n;
}
const josephus = (arr, k) => {
   let n = arr.length;
   let result = new Array(n);
   let map = {};
   for (let i=1; i<=n; i++)
   result[i − 1] = arr[ helper(n, k, i, map) ];
   return result;
};
console.log(josephus(arr, num));

ผลลัพธ์

และผลลัพธ์ในคอนโซลจะเป็น −

[
   3, 6, 2, 7,
   5, 1, 4
]