এই সমস্যায় নাম পড়েছে ঐতিহাসিক জোসেফাস-র জীবনের সবচেয়ে গুরুত্বপূর্ণ ঘটনা থেকে - তাঁর বর্ণনা অনুযায়ী, তিনি এবং তাঁর ৪০ সৈনিক রোমানদের দ্বারা একটি গুহায় ঘিরে পড়েছিলেন সিজের সময়।
শত্রুকে আত্মসমর্পণ না করে তারা 마시 আত্মহত্যার পথ বেছে নিল, একটু টুইস্টের সাথে - তারা একটি সার্কেল বানিয়ে প্রতি তিন জনে এক জনকে হত্যা করল, যতক্ষণ না এক জন বাঁচল (যিনি 후তে আত্মহত্যা করবেন কাজটি শেষ করার জন্য)।
জোসেফাস এবং অন্য একজন শেষ দুজন ছিলেন, এবং আমরা যেহেতু গল্পের সব ডিটেইল জানি, সঠিক অনুমান করতে পারেন তারা মূল পরিকল্পনা অনুসরণ করেননি।
আমাদের একটি জাভাস্ক্রিপ্ট ফাংশন লিখতে হবে যা জোসেফাস পারমিউটেশন রিটার্ন করবে।
প্যারামিটার হিসেবে গ্রহণ করবে আইটেমের প্রাথমিক অ্যারে/লিস্ট যেন সার্কেলে থাকেন এবং প্রতি k স্থান পরেরjén গুনা হয় যতক্ষণ কেউ থাকেন।
উদাহরণস্বরূপ, n=7 এবং k=3 হলে josephus(7,3) এইভাবে কাজ করবে -
[1,2,3,4,5,6,7] - প্রাথমিক সিকোয়েন্স [1,2,4,5,6,7] => 3 কাউন্ট আউট হয়ে রেজাল্টে যায় [3] [1,2,4,5,7] => 6 কাউন্ট আউট হয়ে রেজাল্টে যায় [3,6] [1,4,5,7] => 2 কাউন্ট আউট হয়ে রেজাল্টে যায় [3,6,2] [1,4,5] => 7 কাউন্ট আউট হয়ে রেজাল্টে যায় [3,6,2,7] [1,4] => 5 কাউন্ট আউট হয়ে রেজাল্টে যায় [3,6,2,7,5] [4] => 1 কাউন্ট আউট হয়ে রেজাল্টে যায় [3,6,2,7,5,1] [] => 4 কাউন্ট আউট হয়ে রেজাল্টে যায় [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]