Вызов
В кратчайшем количестве кода:
- Вычислите длину цикла перестановки идеального перемешивания на колоде карт любого размера n (где n ≥ 2, а n четное).
- Выведите таблицу всех длин циклов для 2 ≤ n ≤ 1000 ( четное n ).
Обратите внимание, что есть два основных способа определения идеального шаффла. Существует перетасовка , в которой первая карта находится сверху, а последняя - снизу, а в перетасовке первая и последняя карты перемещаются на одну позицию к центру. Вы можете выбрать, будете ли вы делать это в случайном порядке или в случайном порядке; алгоритм почти идентичен между ними.
- перестановка 10-карточной колоды: [1,2,3,4,5,6,7,8,9,10] ↦ [1,6,2,7,3,8,4,9,5, 10].
- в колоде из 10 карт: [1,2,3,4,5,6,7,8,9,10] ↦ [6,1,7,2,8,3,9,4,10, 5].
Графический пример
Здесь мы видим, что в случайном порядке в колоде из 20 карт продолжительность цикла составляет 18 шагов. (Это только для иллюстрации; ваше решение не обязано выводить циклы графически.) С другой стороны, классическая колода из 52 карт имеет продолжительность цикла перестановки всего 8 шагов (не показано).
В случайном порядке в колоде из 20 карт продолжительность цикла составляет всего 6 шагов.
Табличный пример вывода
Ваша программа должна выводить что-то похожее на это, хотя вы можете выбрать любой табличный формат, который вам больше нравится. Это для перестановки:
2 1
4 2
6 4
8 3
10 6
12 10
14 12
16 4
18 8
20 18
22 6
24 11
26 20
28 18
30 28
32 5
34 10
36 12
38 36
40 12
...many lines omitted...
1000 36
Вопросов
- Есть ли какая-либо связь между числовым входом n и его счетчиком циклов, когда n является степенью 2?
- Как насчет того, когда n не является степенью 2?
- Любопытно, что колода из 1000 карт имеет количество циклов вне случайного перемешивания всего 36, а колода из 500 карт имеет количество циклов вне случайного перемешивания 166. Почему это может быть?
- Какое наибольшее число вы можете найти, чье число циклов c значительно меньше n , а это означает, что отношение n / c максимально?
источник
Ответы:
Хаскелл,
474644 (в случайном порядке)основная реализация состоит в том, что это порядок 2 в мультипликативной группе модуля
n+1
.источник
l=
- само выражение достаточно. Это допустимая программа при запуске в интерактивной командной строке.Pyth, 16 байт
В случайном порядке с использованием A002326 .
источник
Pyth, 22 байта
Попробуйте онлайн: Демонстрация . Замените 500 на меньшее число, если оно слишком медленное.
Объяснение:
источник
Mathematica, 53 (в случайном порядке)
или не антагонистически разнесены
Вывод:
Каждая запись в обоих столбцах горизонтально центрирована в их столбцах, но у меня нет дробных пробелов
 
... 
здесь, чтобы повторить это.Замечания:
{2^n - 2, n}
,{2^n, 2n}
. (Перемешать пары2^n
сn
.)2
от ближайшего конца колоды удваивается на каждом шаге.{2, 4, 8, 15 = -5, -10, -20}
, На самом деле это верно для каждой карты. Поэтому нам нужно только знать, какая сила2
соответствует1
моду,n+1
гдеn
количество карт. (Обратите внимание, что в этом примере карты в последнем столбце, столбце-1
, удваиваются до предпоследнего столбца,-2
что означает, что0
это соответствует одной карте больше, чем в колоде, то есть «modn+1
».) Следовательно, MultiplicativeOrder [] Функция - путь (в Mathematica).источник
С 86 (или 84)
Оценка исключает ненужные пробелы, включенные для наглядности.
Это перетасовка, которая, как отмечают другие, является просто перетасовкой с удаленными стационарными картами на обоих концах.
Как указывалось другими, в случайном порядке позиция каждой карты удваивается каждый раз, но это нужно делать по модулю.
n+1
. Мне нравится думать, что позиция дополнительной карты - это нулевая позиция слева от стола (вы можете думать об этом как о том, что вы держите обе стационарные карты из аут-шаффла). Очевидно, что позиция карты всегда должна быть положительной, поэтому нулевая позиция всегда остается пустой для случая случайного выбора.Код инициализируется
i
значениемn
. Затем он умножается на 2, принимает мод результата(n+1)
и проверяетi
, вернул ли он свое первоначальное значение (i-n
равно нулю). Он увеличиваетсяj
для каждой итерации, кроме последней (отсюда необходимость инициализацииj
до 1.)В принципе,
i
может быть с любым значением в диапазоне1..n
, при условии, что сравнение в конце проверяет, было ли оно инициализировано к тому же числу. Причиной выбораn
было убедиться, что программа работает на случайn==0
. проблема заключалась в том, что любое число по модулю(0+1)
равно нулю, поэтому цикл в этом случае никогда не прерывался, еслиi
был инициализирован константой, такой как 1.Примеры вопросов включают в себя эквивалентный случай
n==2
для шаффла, поэтому было истолковано, что этот случай необходим. Если это не так, два байтаn,
могут быть сохранены путем инициализацииi
в 1, то же значение, что иj
.источник