Соревнование
Напишите функцию, которая принимает два положительных целых числа n и k в качестве аргументов и возвращает номер последнего человека, оставшегося из n после отсчета каждого k-го человека.
Это задача игры в гольф, поэтому выигрывает самый короткий код.
Проблема
n человек (от 1 до n ) стоят по кругу, и каждый k-й отсчитывается до тех пор, пока не останется один человек (см. соответствующую статью в Википедии ). Определите номер этого последнего человека.
Например, при k = 3 два человека будут пропущены, а третий будет отсчитан. Т.е. при n = 7 числа будут отсчитываться в порядке 3 6 2 7 5 1 (подробно 1 2 3 4 5 6 7 1 2 4 5 7 1 4 5 1 4 1 4 ) и, таким образом, ответ равен 4 .
Примеры
J(7,1) = 7 // people are counted out in order 1 2 3 4 5 6 [7]
J(7,2) = 7 // people are counted out in order 2 4 6 1 5 3 [7]
J(7,3) = 4 // see above
J(7,11) = 1
J(77,8) = 1
J(123,12) = 21
{k block}
над[0..n-1]
получить васg(0,k) 0 k
начать? Извините, если я публикую эти вопросы не в том месте.0 1 block
. Очень удобно, что это происходитg(1, k) (2-1) block
. Так что это начинается с,g(1,k) 1
а неg(0,k) 0
. Затем, выполнив блок, он выталкивает следующий элемент из array (2
) и снова выполняет блок и т. Д.Minsky Register Machine (25 состояний без остановки)
Технически это не функция, но это компьютерная парадигма, которая сама по себе не имеет функций ...
Это небольшое изменение в основном тестовом примере моей первой задачи интерпретации MRM :
Ввод в регистры
n
иk
; вывод в регистрr
; Предполагается, чтоr=i=t=0
на входе. Первые две инструкции остановки являются ошибочными случаями.источник
k=1
тогдаr=0
. Хм, я должен снова подумать об этом ...i
просто считается от того,2
вn
то времяr
как регистр, который накапливает результат.Python, 36
Я также использовал формулу из Википедии:
Примеры:
источник
Mathematica,
3836 байтТа же формула Википедии:
источник
If[#<2,1,Mod[#0[#-1,#2]+#2,#,1]]&
С, 40 символов
Это в значительной степени просто формула, которую дает приведенная выше статья в википедии:
Для разнообразия, вот реализация, которая фактически запускает симуляцию (99 символов):
источник
j(n,k){return--n?(j(n,k)+k-1)%-~n+1:1;}
.постоянный ток, 27 байт
Использует повторение из статьи Википедии. Объяснение:
источник
J, 45 знаков
Запускает симуляцию.
Как вариант, используя формулу (31 символ):
Надеюсь, Говард не возражает, что я немного изменил формат ввода, чтобы он соответствовал двоичному глаголу в J.
Использование:
источник
GolfScript,
3224 байтаИспользование: Ожидает, что два параметра n и k находятся в стеке, и оставляет выходное значение.
(спасибо Питеру Тейлору за предложенный итеративный подход и множество других советов)
Старый (рекурсивный) подход из 32 символов:
Это мой первый GolfScript, поэтому, пожалуйста, дайте мне знать вашу критику.
источник
1-
имеет специальный код операции(
. Точно так же1+
есть)
. Вам не нужно использовать алфавитные символы для хранения, так что вы можете использовать, например,^
вместоJ
и без пробела после него. У вас гораздо больше,$
чем обычно в хорошо сыгранной программе: подумайте, сможете ли вы уменьшить их, используя некоторую комбинацию\@.
.$
ссылки.g
из статьи в Википедии и используйте,
и/
.{,{\2$+\)%}*)\;}:f;
Убедитесь, что вы понимаете, почему это работает;)k
внутри цикла, а затем еще 2 для его удаления в конце, мы можем использовать его+
для сокращения до 17 символов:{{@+\)%}+\,*)}:f;
я сомневаюсь, что это можно улучшить.Р, 48
Рабочая версия с примерами: http://ideone.com/i7wae
источник
Groovy, 36 байт
источник
Хаскелл, 68
Есть ли актуальная симуляция. Демонстрация:
источник
Scala, 53 байта
источник
С, 88 символов
Выполняет симуляцию, не рассчитывает формулу.
Гораздо длиннее, чем формула, но короче, чем другие симуляции Си.
Примечания:
1. Выделяет память и никогда не освобождает.
2. выделяет
n*8
вместоn*4
, потому что я используюp[n]
. Можно выделить(n+1)*4
, но это больше символов.источник
C ++, 166 байт
Golfed:
Ungolfed:
источник
J
функции, используя троичный оператор.intn
в вашей версии для гольфа не скомпилируется#include <list>
J, 8 байт
источник
Рубин, 39 байт
Рабочая версия с тестовыми примерами: http://ideone.com/pXOUc
источник
Q, 34 байта
Использование:
источник
Рубин, 34 байта
источник
Хаскелл, 29
Используя формулу из википедии.
источник
JavaScript (ECMAScript 5), 48 байт
Использование ECMAScript 5, так как это была последняя версия JavaScript на тот момент, когда задавался этот вопрос.
Версия ES6 (не конкурирующая), 33 байта
объяснение
Не так много, чтобы сказать здесь. Я просто реализую функцию, которую дает мне статья в Википедии.
источник
05AB1E , 11 байт
Попробуйте онлайн!
источник
восьмых , 82 байта
Код
SED (диаграмма эффекта стека):
n k -- m
Использование и объяснение
Алгоритм использует массив целых чисел следующим образом: если значение people равно 5, тогда массив будет [1,2,3,4,5]
источник
J , 24 байта
Попробуйте онлайн!
Итеративный подход, основанный на решении динамического программирования.
объяснение
источник
J , 19 байт
Попробуйте онлайн!
Как это работает
источник
Дротик , 33 байта
Попробуйте онлайн!
источник
Japt , 15 байт
Попробуйте онлайн!
Байт может быть сохранен с помощью 0-индексации k , но на самом деле это не индекс, поэтому я решил против этого.
Объяснение:
источник
Japt
-h
, 10 байтПопытайся
источник
Powershell, 56 байт
Важный! Скрипт вызывает себя рекурсивно. Так что сохраните скрипт как
f.ps1
файл в текущем каталоге. Также вы можете вызвать переменную блока скрипта вместо файла скрипта (см. Тестовый скрипт ниже). Это звонки имеет одинаковую длину.Тестовый скрипт:
Выход:
источник