CodeWars符号化問題2021年04月06日-Josephus Permutation


[質問]


This problem takes its name by arguably the most important event in the life of the ancient historian Josephus: according to his tale, he and his 40 soldiers were trapped in a cave by the Romans during a siege.
Refusing to surrender to the enemy, they instead opted for mass suicide, with a twist: they formed a circle and proceeded to kill one man every three, until one last man was left (and that it was supposed to kill himself to end the act).
Well, Josephus and another man were the last two and, as we now know every detail of the story, you may have correctly guessed that they didn't exactly follow through the original idea.
You are now to create a function that returns a Josephus permutation, taking as parameters the initial array/list of items to be permuted as if they were in a circle and counted out every k places until none remained.
Tips and notes: it helps to start counting from 1 up to n, instead of the usual range 0..n-1; k will always be >=1.
For example, with n=7 and k=3 josephus(7,3) should act this way.
[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]

So our final result is:
josephus([1,2,3,4,5,6,7],3)==[3,6,2,7,5,1,4]

(要約)所与の配列をk移動した後、抽出を繰り返し、配列に追加した配列return.

[回答]


function josephus(items,k){ const answer = []; const length = items.length; let index = k > length ? (k % length) - 1 : k - 1; for(let i = 0; i < length - 1; i++) { answer.push(items.splice(index, 1)[0]); for(let j = 0; j < k - 1; j++) { index++; if(index >= items.length) { index -= items.length; } } } if(items.length) answer.push(items[0]); return answer; } 最初に引くインデックスを求めると、kが配列長より長い場合もあるので条件を付けます。 二重ループ文で、インデックスの要素を外部から抽出し、答えに入れます。 内層の重複文ではindexを増やし、配列の末尾に達すると、最初に戻り、再びindexを検索します。 配列に要素を見つけ、最後の要素を答えに入れます。 最後の要素を単独で処理するのは、配列の最後の最初の回転中にindexが正常に処理できない場合があるためです。