На этом сайте есть вопрос, который похож на этот вопрос, но я добавил изюминку.
У вас есть три входа: количество людей в круге n , k-й человек, отсчитываемый на каждом шаге, и q-й человек, который выжил. Люди в круге пронумерованы от 1 до n .
Например, в кругу из 20 человек выживший 20-й - это самый первый удаленный человек, оставшийся в живых 19-й - второй удаленный человек и так далее. Обычно проблема Иосифа заключается в том, чтобы определить, кто из последних удален, здесь его называют первым выжившим.
Напишите самую короткую программу или функцию, которая с этими тремя входными данными возвращает номер q-го человека, который выжил.
Если есть какие-либо вопросы с ясностью, пожалуйста, дайте мне знать.
Некоторые примеры:
>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46
Изменить: Предположим, что все входные данные действительны То есть никто не попросит 0 или отрицательных чисел, и никто не попросит 20-го выжившего в кругу из 5 человек (то есть 1 ≤ q ≤ n)
Изменить: Я приму ответ в полночь UTC + 7 в начале 2 декабря.
q=1
это точно так же, как связанный вопрос Иосифа, верно?Ответы:
Pyth, 16 байт
Попробуйте онлайн: демонстрация или тестовый набор
Вход имеет форму
k<newline>n<newline>q
.Объяснение:
источник
Пит,
280273 кодексаРедактировать: Я еще немного ударил это, и думаю, что смогу еще больше, но это еще впереди. На данный момент, я просто рад, что это работает, и что у меня было место, чтобы подписать его в левом нижнем углу. У меня есть две идеи, чтобы сохранить больше кодов: а) изменить конечные инструкции
pop, push 1, add, out num
(pop n, output r + 1) и b) снова дублировать в левом нижнем углу, чтобы сохранить кодеры при манипуляциях со стеком позже в цикле.На картинке выше мой код в 8 пикселей на кодель. В общем, это тот же алгоритм, что и в моем ответе на Python, но с входными данными в порядке k , q , n . На практике также существует много манипуляций со стеком. Вы можете попробовать это здесь , открыв изображение там и запустив код с ним.
объяснение
Это пошаговое решение проблемы.
источник
CJam,
222019 байтовЭто читает вход как
q k n
. Попробуйте онлайн в интерпретаторе CJam .Как это работает
источник
Golfscript,
585655353130 байтПредполагая, что три входа уже находятся в стеке, в порядке n , k , q
Это решение предполагает, что мне нужно избавиться от всего, кроме окончательного ответа.
Как это работает
Смотрите
j(n,k,q)
в моем решении Python 3 для более подробной информации.Редактировать 1: Использовано предложение @ Doorknob (добавлено +, чтобы получить все входные данные в массив)
Раньше,
Редактирование 2: добавлено ~, согласно правилам вики, и сокращено код. Спасибо @Dennis
Раньше,
Редактировать 3: Реализован более короткий алгоритм.
Раньше,
Редактировать 4: понял, что я мог бы использовать в
%
качестве карты.Раньше,
Редактировать 5: Незначительное редактирование. Измененный
2$
для@
сделать[0..q-1]
и3$
для2$
извлекатьk
. Сохранил укусРаньше,
источник
\;\;\;\;
может быть заменено на])\;
(обтекание в массиве, право-отмены, своп и поп).JavaScript (ES6), 56 байт
Ungolfed
По сути, это адаптация JavaScript к ответу Python @ Sherlock9 .
Тест
источник
Mathematica, 50 байтов
Анонимная функция. Принимает входные данные в порядке
q,n,k
.источник
C,
8173 байтаОсновано на реализации моего Python ответа @ user81655 на Javascript.
Изменить: Удалено я
Тест
источник
int
перед именами параметров.Python 3,
726662 байтаФункция динамического программирования в 62 байта. Адаптировано из алгоритма в Википедии. Раньше была прямая реализация этого алгоритма, когда q = 1 (т.е. i = 1, r = 0) на этой странице, но я вижу, что это было удалено сейчас.
Редактировать 1: я удалил,
i
чтобы сохранить 4 байта. Объяснение остается без изменений.Редактировать 2: Просчет в байтах. Я использовал
\r\n
для EOL и не заметил, когда это добавило 3 байта. Я снизил количество байтов соответственно.Как это работает
Спасибо @Dennis за напоминание, что я должен объяснить свой код (хотя бы неявно, потому что он включил один в свой ответ). Если что-то неясно, пожалуйста, дайте мне знать.
Редактировать:
Раньше,
Итерационная функция, адаптированная из « Бетонной математики » Грэмом, Кнутом и Паташником. Хотя этот алгоритм длиннее, он быстрее для больших n и малых k .
источник
+
.PHP, 71 байт
Основано на ответах @ Sherlock9. Смотрите его Python ответ для алгоритма.
Как вариант, вот мой оригинальный наивный подход без алгоритма. Это использует массив, чтобы отметить, какие люди найдены.
91 байт
источник
Haskell,
484743 байтаНа основе алгоритма Хаскелла на кодовой странице Розетты функции Джозефуса с двумя входами. Предложения по игре в гольф приветствуются.
Редактировать: Моя благодарность Ними за помощь в игре в гольф первого алгоритма, предложив бессмысленную версию, и за помощь в игре второго алгоритма, сообщив мне, что
until
ключевое слово существует.Версия алгоритма в конце моего ответа на Python, адаптированная из «Конкретной математики» Грэмом, Кнутом и Паташником. Хотя этот алгоритм длиннее на 62 байта, и его не так много, как первого, он быстрее для больших
n
и маленькихk
.Ungolfed:
Первый алгоритм
Второй алгоритм
источник
until
для (более или менее) прямого перевода версии Python 2 - го алгоритма:(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
.foldl
бесконечные списки и все такое. Спасибо за вашу помощь!Язык GameMaker (GML), 88 байт
Основано на ответе @ user81655
источник
Желе ,
1413 байтовTryItOnline!
Как?
источник
Рубин,
5348 байтЛямбда
Как это работает
источник