Довжина циклу для ідеальних перетасовок колод будь-якого розміру


10

Виклик

У найкоротшій кількості коду:

  1. Обчисліть тривалість циклу перестановки ідеального переміщення на колоді карт будь-якого розміру n (де n ≥ 2 і n парне).
  2. Виведіть таблицю всіх довжин циклу для 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 карт

У перетасування на палубі 20 карт має довжину циклу тільки 6 кроків.

Цикл переміщення для колоди з 20 карт

Табличний приклад результату

Ваша програма повинна вивести щось подібне до цього, хоча ви можете вибрати будь-який табличний формат, який вам найбільше подобається. Це для випадкових перебоїв:

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

Запитання

  1. Чи здається, що існує якийсь зв’язок між числом вводу n та його кількістю циклів, коли n - потужність 2?
  2. Як щодо того, коли n не є потужністю 2?
  3. Цікаво, що колода на 1000 карт має кількість циклів відміни лише 36, тоді як колода на 500 карт має цикл відміни 166. Чому це може бути?
  4. Яке найбільше число ви можете знайти, кількість циклів c яких значно менше n , тобто співвідношення n / c є максимальним?


Так, все ж таки про показ результатів. Це питання стосується створення таблиці для будь-якого значення n ; це більше математичний характер.
Тодд Леман

плутав мене там із 6/8 циклами в продемонстрованому на хороший час :) (я думав, що моє втілення було неправильним). нарешті я подивився на зображення і побачив, що це 6 циклів, і я його відредагував. смішно
гордий haskeller

@proud haskeller - ах так, дякую!
Тодд Леман

1
Це послідовність A002326 .
orlp

Відповіді:


6

Хаскелл, 47 46 44 (у перетасуванні)

[[i|i<-[1..],mod(2^i)n<2]!!0|n<-[3,5..1001]]

основна реалізація полягає в тому, що це порядок 2 в мультиплікативній групі модулів n+1.


1
Можна видалити l=- самого виразу достатньо. Це дійсна програма при запуску в інтерактивному командному рядку.
orlp


2

Піт, 22 байти

V500,JyhNl{.u.iFc2NJUJ

Спробуйте в Інтернеті: Демонстрація . Замініть 500 меншою кількістю, якщо вона занадто повільна.

Пояснення:

V500                     for N in [0, 1, ..., 499]:
      yhN                   (N + 1) * 2
     J                      assign to J
           .u      JUJ      apply the following expression J times
                            to N, starting with N = [0, 1, ..., J - 1],
                            and return all intermediate results:
                c2N            split N into 2 halfs
             .iF               and interleave them
         l{                 remove duplicates and give length
    ,                       make a pair and print

1
Начебто божевільне, що пітовий розчин, який виконує фактичну роботу переміщення та підрахунку колод, лише наполовину довший, ніж рішення haskell, яке використовує просту формулу, миттєво прогнозує результат
Falco

@Falco Я знаю правильно
гордий haskeller

1
@Falco Я насправді намагався зробити пітовий портфель своєї відповіді, але не міг зрозуміти, як це зробити. Тож я лише півгодини грав у піт
гордий haskeller

Будьте раді, що ви не пробували <> <
Falco

2

Математика, 53 (в такт)

Grid[{2#,MultiplicativeOrder[2,2#+1]}&/@Range[1,500]]

або не розташовані антагоністично

Grid[{2 #, MultiplicativeOrder[2, 2 # + 1]} & /@ Range[1, 501]]

Вихід:

   2    2
   4    4
   6    3
   8    6
  10   10
  12   12
  14    4
  16    8
  18   18
  20    6
 (* digits, digits, bo bidgits, banana fana, ... *)
  498  166
  500  166
 (* skip a bit, brother ...  *)
  998   36
 1000   60

Кожен запис в обох стовпцях горизонтально центрований у їх стовпцях, але у мене немає дробових пробілів &#8194;... &#8202;тут, щоб це повторити.

Спостереження:

  • Out-shuffle - це in-shuffle на палубі на дві картки менше. (Зверніть увагу, що перша та остання картки знаходяться у фіксованому положенні протягом демонстрації перетасовки.) Отже, обидва варіанти призведе до подібних списків виводу - другий стовпчик буде зміщений на один рядок. Що стосується «повноважень два» натяку, в-перетасовки влади два палуб мають візерунок {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відповідає одній картці більше, ніж є в колоду, таким чином "мод n+1".) Тому MultiplicativeOrder [] функція - це шлях (в Mathematica).
  • За замовчуванням можна спробувати TableForm [] замість Grid [], але вихід аналогічний.

Ваш приклад видається невірним
гордий haskeller

@proudhaskeller: для перетасування чи перемішування? Будь-яке дозволено. (І як зазначалося, один - це лише зміна рядка в правому стовпчику іншого.)
Ерік Тауерс

Вони обидва, здається, не підходять. Подивіться приклад результату у питанні. Можливо, ваш приклад неправильний, а власне код правильний, а приклад просто застарів, я не знаю, але він, здається, не підходить.
гордий haskeller

ponoshaskeller: Я, здається, набрав свій приклад на "8". І заплутався якнайменше один раз. Редагування. Дякуємо, що наполегливі. :-)
Eric Towers

0

C, 86 (або 84)

Оцінка виключає зайву пробіл, включену для наочності.

i,j,n;
main(){
  for(;n<1002;printf("%d %d\n",n,j),n+=2)
    for(i=n,j=1;i=i*2%(n+1),i-n;)j++;
}

Це in-shuffle, що, як вказували інші, - це просто перемішання з вилученими нерухомими картами на обох кінцях.

Як зазначають інші, у змішаному стані положення кожної карти щоразу подвоюється, але це потрібно приймати за модулем 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.