Если бы вы сделали «Array(N)», вы могли бы использовать их пустое состояние в качестве триггера, пропуская бессмысленный внутренний цикл.

Если у вас есть несколько var подряд, не говорите var для каждого, вместо этого используйте запятую.

Когда у вас есть совершенно хороший цикл условия вместо while(true), в 99% случаев, когда вы видите while(true), вы смотрите на ошибочную или сломанную логику.

Но самое главное, вы ссылаетесь на несуществующую переменную K. Вы имели в виду М, который вы не использовали? Это лишь часть того, почему неважно, как сильно «за классной доской» математические придурки ЛЮБЯТ свои однобуквенные переменные, они просто поощряют делать ошибки в любой реальной задаче.

Даже не говорите мне о бессмысленном использовании CONST, выполняющем обычную работу функции, или о пропуске точки с запятой, умоляющей о хрупкости кода.

И ваше решение даже не работает, поскольку, если M на самом деле является вашим K, вы не увеличиваете его по кругу и не компенсируете попадания в пул.

Таким образом, в вашем примере 11,3 должно возвращать [ 8, 4, 10, 1, 7, 6, 2, 11, 9, 3, 6 ], но ваша логика ошибочна.

function joseph(numPrisoners, skip) {
  var
    result = Array(numPrisoners),
    dead = 0,
    finger = 0;
  while (dead < numPrisoners) {
    var i = skip;
    // skip ahead
    do {
      finger = (finger + 1) % numPrisoners;
      // only count the living
      if (!result[finger]) i--;
    } while (i);
    // if we landed on the dead, skip ahead to the next living
    while (result[finger]) finger = (finger + 1) % numPrisoners;
    result[finger] = ++dead;
  }
  return result;
}
console.log(joseph(11,3)); // [ 8, 4, 10, 1, 7, 6, 2, 11, 9, 3, 6 ]

Видеть?