Her boyutta desteğin mükemmel karıştırılması için çevrim uzunlukları


10

Meydan okuma

En kısa kodda:

  1. Herhangi bir n boyutunda ( n ≥ 2 ve n'nin eşit olduğu) bir kart destesinde mükemmel bir karıştırmanın permütasyon döngüsünün uzunluğunu hesaplayın .
  2. 2 ≤ n ≤ 1000 ( n çift) için tüm döngü uzunluklarında bir tablo çıktısı alın .

Mükemmel bir karıştırmayı tanımlamanın iki temel yolu olduğunu unutmayın. Orada dışı karıştır üstünde ilk kartı ve altta geçen kart tutar ve orada in-karıştır merkezine doğru ilk ve son kartları bir pozisyon kaydırılır. Karışık mı yoksa karışık mı yapacağınızı seçebilirsiniz; algoritma ikisi arasında neredeyse aynıdır.

  • 10 kartlık destenin karışıklığı : [1,2,3,4,5,6,7,8,9,10] ↦ [1,6,2,7,3,8,4,9,5, 10].
  • içinde shuffle 10 kart güverte: [1,2,3,4,5,6,7,8,9,10] ↦ [6,1,7,2,8,3,9,4,10, 5].

Grafik örneği

Burada, 20 kartlık bir destedeki bir karışıklığın döngü uzunluğunun 18 adım olduğunu görüyoruz . (Bu yalnızca açıklama amaçlıdır; çözümünüzün döngüsel olarak grafik çıktısı alması gerekmez.) Öte yandan, klasik 52 kartlı deste, sadece 8 adımlık (gösterilmemiştir) bir dışarı karıştırma döngüsü uzunluğuna sahiptir.

20 kartlık deste için dışarı karıştırma döngüsü

Bir in-karışık 20 kart güvertede sadece 6 adımların bir döngü uzunluğu vardır.

20 kartlık deste için karıştırma içi döngü

Tablo halinde çıktı örneği

En sevdiğiniz tablo biçimlerini seçebilmenize rağmen, programınız buna benzer bir çıktı almalıdır. Bu bir karışıklık içindir:

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

Sorular

  1. N 2'nin gücü olduğunda, n sayısı girişi ve döngü sayısı arasında herhangi bir bağlantı var mı ?
  2. N 2'nin gücü olmadığında ne olur ?
  3. Merakla, 1000 kartlık bir desteğin sadece 36'lık bir shuffle döngü sayısı vardır, 500'lük bir kart destesinin 166'lık bir shuffle döngü sayısı vardır. Neden olabilir?
  4. Çevrim sayısı c n'den büyük oranda küçük olan bulabileceğiniz en büyük sayı nedir , yani n / c oranı en üst düzeye çıkarılır?


Ya, bu daha çok sonuçları göstermekle ilgili. Bu soru n'nin herhangi bir değeri için bir tablo oluşturmakla ilgilidir ; doğada daha matematiksel.
Todd Lehman

orada iyi bir süre için 6/8 döngüleri ile beni şaşırttı :) (benim imlementation yanlış olduğunu düşündüm). Sonunda görüntüye baktım ve 6 döngü olduğunu gördüm, bu yüzden düzenledim. komik
gururlu haskeller

@proud haskeller - ah evet, teşekkür ederim!
Todd Lehman

Yanıtlar:


6

Haskell, 47 46 44 (karışık olarak)

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

temel farkındalık, bunun çarpımsal modül grubundaki 2 sırasıdır n+1.


1
l=- ifadesini kaldırabilirsiniz . Bu, etkileşimli komut satırında çalıştırıldığında geçerli bir programdır.
orlp

5

Pyth, 16 bayt

mfq1%^2T+3yd)500

A002326 kullanarak karışık karıştırma .


2

Pyth, 22 bayt

V500,JyhNl{.u.iFc2NJUJ

Çevrimiçi deneyin: Gösteri . Çok yavaşsa 500'ü daha küçük bir sayıyla değiştirin.

Açıklama:

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
Güverteların karıştırılması ve sayılmasının gerçek işini yapan bir pıhtı çözeltisinin, kolay bir formül kullanan haskell çözeltisinin sadece yarısını tahmin etmesi çok
Falco

@Falco Doğru biliyorum
gurur haskeller

1
@Falco Aslında cevabımın cevabını yapmaya çalıştım ama nasıl yapacağımı anlayamadım. Bu yüzden yarım saat boyunca pyth ile oynamaya başladım
gururlu haskeller

Denemediğiniz için mutlu olun <> <
Falco

2

Mathematica, 53 (karıştırmalı)

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

veya antagonistik olarak aralıklı değil

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

Çıktı:

   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

Her iki sütundaki her giriş yatay olarak sütunlarında ortalanır, ancak kesirli boşluklarım yok &#8194;... &#8202;burada çoğaltmak için.

Gözlemler:

  • Dışarıda shuffle iki karttan daha küçük bir destede karıştırılır. (İlk ve son kartların karışık gösterim sırasında sabit konumda olduğunu unutmayın.) Sonuç olarak, iki seçenek benzer çıktı listelerine yol açacaktır - ikinci sütun bir satır kaydırılacaktır. İpucu "İki yetkileri" ile ilgili olarak, in-shuffle iki deste gücünün modeli vardır {2^n - 2, n}, {2^n, 2n}. (Çiftleri-karıştırma 2^nile n).
  • Karışık modda, desteğin 2en yakın ucundan olan mesafenin her adımda iki katına çıktığını gözlemleyin . {2, 4, 8, 15 = -5, -10, -20}. Aslında, bu her kart için geçerlidir . Bu nedenle, sadece hangi güç bilmemiz gerekir 2için uyumlu olan 1mod kartların sayısıdır. (Örnekte, son sütundaki, sütundaki kartların sondan bir önceki sütuna ikiye katlandığını , yani destede olduğundan daha fazla bir karta, yani "mod " a uygun olduğunu unutmayın.) Bu nedenle, MultiplicativeOrder [] işlevi (Mathematica'da) gitmenin yoludur.n+1n-1-20n+1
  • Varsayılan olarak, Grid [] yerine TableForm [] denenir, ancak çıktı benzerdir.

Örnek çıktınız yanlış görünüyor
gururlu haskeller

@proudhaskeller: karışık mı, karışık mı? Her ikisine de izin verilir. (Ve belirtildiği gibi, biri diğerinin sağ sütununda sadece bir satır kaymadır.)
Eric Towers

İkisi de uygun görünmüyor. Sorudaki örnek çıktıya bakın. Belki örnek çıktı yanlış ve gerçek kod doğru ve örnek sadece modası geçmiş, bilmiyorum, ama uygun görünmüyor.
gururlu haskeller

proudhaskeller: Örnek çıktımı "8" de yazdım. Ve en az bir kez içeri ve dışarı karıştı. Düzenleme. Kalıcı olduğunuz için teşekkürler. :-)
Eric Towers

0

C, 86 (veya 84)

Skor, netlik için dahil olan gereksiz boşlukları içermez.

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++;
}

Bu, başkaları tarafından işaret edildiği gibi, her iki uçtaki sabit kartların çıkarıldığı sadece bir karışıklıktır.

Başkaları tarafından işaret edildiği gibi, karışıklık içinde, her kartın konumu her seferinde iki katına çıkar, ancak bu modulo alınmalıdır n+1. Ekstra kart pozisyonunun tablonun solunda sıfır pozisyonu olduğunu düşünmeyi seviyorum (bunu hem sabit kartları hem de karışık modda tutmak olarak düşünebilirsiniz). Açıkça, kartın konumu her zaman pozitif olmalıdır, bu nedenle sıfır konumu her durumda karışık durum için boş kalır.

Kod i, değerini sıfırlar n. Daha sonra 2 ile çarpılır, sonuç modunu alır ve başlangıç ​​değerine dönüp dönmediğini (n+1)kontrol eder i( i-nsıfırdır.) jSonuncusu hariç her yineleme için artar (dolayısıyla başlangıç j1'e ihtiyaç vardır ).

Prensip olarak, sondaki karşılaştırma aynı sayıya intialized olup olmadığını kontrol ettiği sürece iaralıktaki herhangi bir değerle olabilir 1..n. Toplamanın nedeni n, programın durum için çalıştığından emin olmaktı n==0. sorun, herhangi bir sayı modulounun (0+1)sıfır olmasıydı , bu nedenle döngü bu durumda i1 gibi bir sabit değere başlatıldıysa asla sonlandırılmaz .

Soru örnekleri n==2, dışarıdaki shuffle için eşdeğer vakayı içerdiğinden, bu vakanın gerekli olduğu yorumlandı. Değilse, iki bayt , 1 ile aynı değere n,başlatılarak kaydedilebilir . ij

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.