Есть N дверей и K обезьян. Изначально все двери закрыты.
Раунд 1: 1-ая обезьяна посещает каждую дверь и переключает дверь (если дверь закрыта, она открывается; если она открыта, она закрывается).
Раунд 2 : 1-я обезьяна посещает каждую дверь и переключает дверь. Затем Вторая Обезьяна посещает каждую 2-ю дверь и переключает дверь.
, , ,
, , ,
Раунд k: 1-я обезьяна посещает каждую дверь и переключает дверь. , , , , , , , , , K-я обезьяна посещает каждую K-ую дверь и переключает дверь.
Ввод: NK (разделенный одним пробелом)
Вывод: номера дверей, которые открыты, каждая разделена одним пробелом.
Пример :
Вход: 3 3
Выход: 1 2
Ограничения :
0 <N <101
0 <= K <= N
Примечание :
Предположим, что N дверей пронумерованы от 1 до N, а K обезьян пронумерованы от 1 до K
Победит тот, у кого самый короткий код. Кроме того, вывод на дисплей для N = 23, K = 21
источник
n=k=3
будет выводить,1 2
так что вы не правы ... и 5 выходов1 2 4
есть шаблон, но его гораздо менее очевидно, чем это.Ответы:
APL,
322826Explaination
{+/0=⍺|⍨⍳⍵}
это функция, которая возвращает количество раз, когда дверь⍺
(левый аргумент) переключается на раунд⍵
(правый аргумент), что равно количеству факторов⍺
этого ≤⍵
:⍳⍵
Создать числовой массив от 1 до⍵
⍺|⍨
Рассчитать⍺
модуль каждого элемента этого массива0=
Измените на 1, где было 0, и 0 для всех остальных+/
Суммируйте полученный массивВнешняя функция:
(⍳⍺)
,⍳⍵
Генерировать массивы от 1 до N и от 1 до K∘.{...}
Для каждой пары элементов двух массивов примените функцию. Это дает матрицу числа переключений, каждый ряд представляет дверь, а каждый столбец представляет раунд.+/
Суммируйте столбцы. Это дает массив количества раз, когда каждая дверь переключается за все раунды.2|
Модуль 2, поэтому, если дверь открыта, это 1; если он закрыт, это 0.(...)/⍳⍺
Наконец, сгенерируйте массив от 1 до N и выберите только те, в которых есть 1 в массиве на предыдущем шаге./⎕
Наконец, вставьте функцию между числами из ввода.РЕДАКТИРОВАТЬ
,↑⍳¨⍳⍵
Генерация всех "обезьян" (если K = 4, то это1 0 0 0 1 2 0 0 1 2 3 0 1 2 3 4
)⍳⍵
Массив от 1 до⍵
(K)⍳¨
Для каждого из них сгенерируйте массив от 1 до этого числа,↑
Преобразовать вложенный массив в matrix (↑
), а затем распаковать в простой array (,
)(,↑⍳¨⍳⍵)∘.|⍳⍺
Для каждого числа от 1 до⍺
(N), модифицируйте его с каждой обезьяной.0=
Измените на 1, где было 0, и 0 для всех остальных. Это дает матрицу переключений: строки - каждая обезьяна в каждом раунде, столбцы - двери; 1 означает переключение, 0 означает отсутствие переключения.+⌿
Суммируйте строки, чтобы получить массив числа раз, когда каждая дверь переключенаДругие части не изменены
РЕДАКТИРОВАТЬ
Используйте XOR Reduce (
≠⌿
) вместо суммы и мод 2 (2|+⌿
)источник
{}/
вместо того, чтобы просто принимать N и K в качестве аргументов для dfn?i←⍳⍺
GolfScript, 33 символа
Если бы номера были пронумерованы, начиная с нуля, это спасло бы 3 символа.
Примеры ( онлайн ):
источник
Mathematica, 104 символа
Пример:
источник
{n,k}=%~Read~{Number,Number}
.Руби, 88
Основано на ответе @ manatwork.
Эти хитрые глобалы всегда нарушают подсветку синтаксиса!
источник
count
бит мог бы быть улучшен и дальше, я бы хотел, чтобы у ruby был встроенный#sum
метод для таких вещей:>Python 3,
9784Если обезьяна появляется в четном количестве раундов, это не меняет вообще. Если обезьяна появляется четное количество раз, это то же самое, что и в одном раунде.
Таким образом, некоторые обезьяны могут быть опущены, а другие просто должны поменять двери один раз.
Выход для
23 21
:источник
range(2-K%2,K+1,2)
доrange(K,0,-2)
.for
петлю наwhile
петлю:while K>0:r^=set(range(K,N+1,K));K-=2
R - 74
Моделирование:
источник
JavaScript
148127вот (крошечная) читаемая версия:
ДЕМО скрипка
я должен отметить, что он начинает отсчитывать от 0 (технически это ошибка «один за другим»)
источник
b=Array(n);
Это инициализирует ваш массив как длину n, заполненную неопределенным значением. ! undefined имеет значение true, поэтому первый проход обезьяны превратит все это в истины.+1
JavaScript, 153
Выход для N = 23, K = 21:
Протестировано в Chrome, но не использует никаких новых интересных функций ECMAScript, поэтому должно работать в любом браузере!
Я знаю, что никогда не одержу победу над другими записями, и что @tiringToGetProgrammingStrainght уже отправил запись в JavaScript, но я не получил те же результаты для N = 23, K = 21, как и все остальные, поэтому я подумал, что хотел бы попробовать мою собственную версию.
Редактировать : аннотированный источник (просматривая это снова, я обнаружил места для сохранения еще 3 символов, так что это, вероятно, еще можно улучшить ...)
источник
+1
Рубин - 65 символов
Вот расчет в псевдокоде:
Если вы не уверены, что выражение для s (d) является правильным, посмотрите на это так:
источник
n
иk
откуда, правда? И вывод, кажется, разделен символами новой строки, а не пробелами.PowerShell: 132
Гольф-код:
Un-Golfed, прокомментированный код:
источник
Powershell, 66 байт
Тестовый скрипт:
Выход:
источник