Wyzwanie
W najkrótszym kodzie:
- Oblicz długość cyklu permutacji idealnego tasowania na talii kart dowolnego rozmiaru n (gdzie n ≥ 2 i n jest parzyste).
- Wyprowadzić tabelę wszystkich długości cyklu dla 2 ≤ n ≤ 1000 ( n parzystych).
Pamiętaj, że istnieją dwa podstawowe sposoby definiowania idealnego losowania. Istnieje tasowanie na zewnątrz , które utrzymuje pierwszą kartę na górze, a ostatnią na dole, i jest tasowanie , które przesuwa pierwszą i ostatnią kartę o jedną pozycję w kierunku środka. Możesz wybrać, czy wykonujesz przetasowanie, czy tasowanie; algorytm jest prawie identyczny między nimi.
- przetasowanie talii 10 kart: [1,2,3,4,5,6,7,8,9,10] ↦ [1,6,2,7,3,8,4,9,5, 10].
- tasowanie talii 10 kart: [1,2,3,4,5,6,7,8,9,10] ↦ [6,1,7,2,8,3,9,4,10, 5].
Przykład graficzny
Tutaj widzimy, że przetasowanie na talię 20 kart ma długość cyklu 18 kroków. (To tylko dla ilustracji; twoje rozwiązanie nie jest wymagane do graficznego generowania cykli). Z drugiej strony klasyczna talia 52 kart ma długość cyklu wymieszania wynoszącą tylko 8 kroków (nie pokazano).
Przetasowanie w talii 20 kart ma długość cyklu tylko 6 kroków.
Tabelaryczny przykład wyniku
Twój program powinien wypisać coś podobnego do tego, chociaż możesz wybrać dowolny format tabelaryczny, który najbardziej ci się podoba. To jest do przetasowania:
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
pytania
- Czy wydaje się, że istnieje związek między wejściem liczbowym n a liczbą jego cykli, gdy n jest potęgą 2?
- Co powiesz na to, kiedy n nie jest potęgą 2?
- Co ciekawe, w przypadku talii 1000 kart liczba cykli wymieszania wynosi tylko 36, zaś w przypadku talii 500 kart liczba cykli wymieszania wynosi 166. Dlaczego tak może być?
- Jaka jest największa liczba, jaką można znaleźć, której liczba cykli c jest znacznie mniejsza niż n , co oznacza, że stosunek n / c jest zmaksymalizowany?
źródło
Odpowiedzi:
Haskell,
474644 (w kolejności losowej)podstawową realizacją jest to, że jest to rząd 2 w multiplikatywnej grupie modułu
n+1
.źródło
l=
- samo wyrażenie jest wystarczające. To poprawny program, gdy jest uruchamiany w interaktywnym wierszu poleceń.Pyth, 16 bajtów
Odtwarzanie losowe za pomocą A002326 .
źródło
Pyth, 22 bajty
Wypróbuj online: demonstracja . Wymień 500 na mniejszą liczbę, jeśli jest zbyt wolna.
Wyjaśnienie:
źródło
Mathematica, 53 (in-shuffle)
lub, nie antagonistycznie rozmieszczone
Wynik:
Każdy wpis w obu kolumnach jest wyśrodkowany w poziomie w kolumnach, ale nie mam ułamków ułamkowych
 
... 
tutaj, aby to odtworzyć.Obserwacje:
{2^n - 2, n}
,{2^n, 2n}
. (Out-shuffle pary2^n
zn
.)2
od najbliższego końca talii podwaja się na każdym kroku.{2, 4, 8, 15 = -5, -10, -20}
. W rzeczywistości dotyczy to każdej karty. Dlatego musimy tylko wiedzieć, która moc2
odpowiada1
modowi,n+1
gdzien
jest liczba kart. (Zauważ, że w tym przykładzie karty w ostatniej kolumnie, kolumnie-1
są podwojone do przedostatniej kolumny,-2
co oznacza, że0
przystaje do jednej karty więcej niż w talii, a więc „modn+1
”.) Dlatego MultiplicativeOrder [] funkcja jest drogą do przejścia (w Mathematica).źródło
C, 86 (lub 84)
Wynik wyklucza niepotrzebne białe znaki, uwzględnione dla zachowania przejrzystości.
Jest to tasowanie wewnętrzne, które, jak zauważyli inni, jest po prostu tasowaniem zewnętrznym z usuniętymi stacjonarnymi kartami na obu końcach.
Jak zauważyli inni, w tasowaniu pozycja każdej karty podwaja się za każdym razem, ale należy to wziąć modulo
n+1
. Lubię myśleć o tym, że dodatkowa pozycja karty to pozycja zero po lewej stronie stołu (możesz myśleć o tym jako o trzymaniu obu nieruchomych kart przed przetasowaniem). Oczywiście pozycja karty musi zawsze być dodatnia, dlatego pozycja zerowa zawsze pozostaje pusta dla przypadku tasowania.Kod inicjuje
i
się do wartościn
. Następnie mnoży przez 2, pobiera wynikowy mod(n+1)
i sprawdza, czyi
powrócił do wartości początkowej (i-n
wynosi zero). Przyrostujej
dla każdej iteracji, z wyjątkiem ostatniej (stąd potrzeba inicjalizacjij
na 1.)Zasadniczo
i
może mieć dowolną wartość z tego zakresu1..n
, o ile porównanie na końcu sprawdza się, czy zostało zainicjalizowane do tej samej liczby. Powodem pobranian
było upewnienie się, że program działa w przypadkun==0
. problem polegał na tym, że dowolna liczba modulo(0+1)
jest równa zero, więc pętla nigdy się nie kończy w tym przypadku, jeślii
została zainicjowana na stałą, taką jak 1.Przykłady pytań obejmują równoważny przypadek
n==2
tasowania wyjściowego, dlatego interpretowano, że ten przypadek jest wymagany. Jeśli tak nie jest,n,
można zapisać dwa bajty, inicjująci
na 1, taką samą wartość jakj
.źródło