function play( n, k, s ) {
if ( n <= 0 ) return s;
let r = !s;
for ( let i = 1; ( i <= k ) & ( i <= n ); i++ ) {
let g = play( n-i, i+1, !s );
if ( s ) {
r |= g;
if ( g ) f = i;
}
else r &= g;
}
return r;
}
var f = 0;
let n = parseInt( prompt('N') );
let k = parseInt( prompt('K') );
let name = ['John (second', 'Piter (first'];
let res = play ( n, k, true );
alert( name[ res ] + ' player) win.' + ( res ? ' if begin from ' + f : '' ) );
function play( n, k, s ) {
if ( n <= 0 ) // Если игроку выпало играть с N <= 0, это значит,
// что предыдущий игрок забрал последние спички.
// При этом надо выйти из рекурсии. Если s = true, но сейчас ход Пети,
// и значит он выиграл, функция возвращает true.
// Если s = false, но сейчас ход Вани, и значит Петя проиграл,
// функция возвращает false. Поэтому можно просто вернуть s.
return s;
let res = !s; // Аккумулятор результата
for ( let i = 1; ( i <= k ) & ( i <= n ); i++ ) // Игрок перебирает все возможные
// количества убираемых спичек от 1 до K (но не больше N)
if ( s ) // Если ход Пети, то изначальное значение
// аккумулятора res = false, и в цикле мы смотрим,
// если хотя бы ПРИ ОДНОМ варианте дальнейшей игры
// Петя выиграет, то весь результат res = true.
res |= play( n-i, i+1, false ); // Вызывается "новая" игра с изменившимися
// параметрами, ход передаётся Ване (последний параметр false)
else // Если ход Вани, то изначальное значение
// аккумулятора res = true, и в цикле мы смотрим,
// если ВО ВСЕХ вариантах дальнейшей игры Петя выигрывает,
// то Петя только тогда он выигрывает во всех текущей игре res = true
res &= play( n-i, i+1, !s ); // Вызывается "новая" игра с изменившимися
// параметра, ход передаётся Ване (последний параметр false)
return res;
}
let n = parseInt( prompt('N') );
let k = parseInt( prompt('K') );
let name = ['John (second', 'Piter (first'];
alert( name[ play ( n, k, true ) ] + ' player) win' );