Tach!
Eine Lösung (fast) ohne Kommentare kann ich auch bieten, hab sie aber eben erst erstellt und nicht eingereicht.
const inmateCount = 10; const countTo = 3; const amnesty = countTo - 1; let inmates = [...Array(inmateCount + 1).keys()].slice(1); let backToCell = countTo - 1; // starts with countTo but zero-based while (inmates.length > amnesty) { let rest = inmates.length % countTo; inmates = inmates.filter((_, index) => index % countTo != backToCell); backToCell = (backToCell - rest + countTo) % countTo; } console.log(inmates);
Die anderen zwei Zeilen dienen zum Nachjustieren um am Ende des Kreises den Offset für die nächste Runde zu justieren. Aber fragt mich nicht nach den Details, das ist mir zu kompliziert zu erklären.
Hmm, vielleicht doch. Eine Gesetzmäßigkeit ist, dass beim Abzählen mit einer bestimmten Zahl, immer ein Rest der Liste übrig bleibt (auch wenn der 0 ist). Und dieser Rest ist bei der nächsten Runde vom Startoffset abzuziehen. Dabei muss man beachten, dass der neue Offset nicht negativ werden darf. Man muss den Offset im Bereich 0 (inklusive) und der Abzählzahl (exklusive) halten. Der erwähnte Rest wird vor dem Kürzen der Liste ermittelt und in rest
festgehalten, die dritte Zeile im while erledigt das Abziehen. Das Addieren von countTo und die anschließende Modulo-Operation sorgt dafür, dass das Ergebnis nicht ins Negative abrutscht. Diese Korrektur müsste nicht immer erfolgen, ein if < 0
wäre auch eine Variante. Aber es stört auch nicht, countTo zu oft zu addieren, denn mit dem Modulo wird das wieder in den erlaubten Wertebereich zurückgeholt. Modulo mit negativen Dividenden führt aber nicht zum Ziel, deswegen die Addition.
dedlfix.