Độ dài chu kỳ cho các xáo trộn hoàn hảo của sàn có kích thước bất kỳ


10

Thử thách

Trong số lượng mã ngắn nhất:

  1. Tính độ dài của chu kỳ hoán vị của một shuffle hoàn hảo trên cỗ bài có kích thước n bất kỳ (trong đó n ≥ 2 và n chẵn).
  2. Xuất ra một bảng có tất cả độ dài chu kỳ cho 2 ≤ n 1000 ( n chẵn).

Lưu ý rằng có hai cách cơ bản để xác định một shuffle hoàn hảo. Có thẻ xáo trộn , giữ thẻ đầu tiên ở trên và thẻ cuối cùng ở dưới, và có thẻ xáo trộn , di chuyển thẻ đầu tiên và thẻ cuối cùng một vị trí về phía trung tâm. Bạn có thể chọn xem bạn đang thực hiện xáo trộn hay xáo trộn; thuật toán gần như giống hệt nhau giữa hai.

  • xáo trộn bộ bài 10 lá: [1,2,3,4,5,6,7,8,9,10] ↦ [1,6,2,7,3,8,4,9,5, 10].
  • xáo trộn bộ bài 10 lá: [1,2,3,4,5,6,7,8,9,10] [6,1,7,2,8,3,9,4,10, 5].

Ví dụ đồ họa

Ở đây, chúng ta thấy rằng việc xáo trộn trên bộ bài 20 lá có độ dài chu kỳ là 18 bước. .

Chu kỳ xáo trộn cho bộ bài 20 lá

Một xáo trộn trên bộ bài 20 lá có độ dài chu kỳ chỉ 6 bước.

Chu kỳ xáo trộn cho bộ bài 20 lá

Ví dụ dạng bảng của đầu ra

Chương trình của bạn sẽ xuất ra một cái gì đó tương tự như thế này, mặc dù bạn có thể chọn bất kỳ định dạng bảng nào bạn thích nhất. Đây là một sự xáo trộn:

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

Câu hỏi

  1. Có vẻ như có bất kỳ kết nối nào giữa số đầu vào n và số chu kỳ của nó, khi n là lũy thừa của 2?
  2. Làm thế nào về khi n không phải là một sức mạnh của 2?
  3. Thật kỳ lạ, một cỗ bài 1000 lá có số chu kỳ xáo trộn chỉ 36, trong khi cỗ bài 500 lá có số chu kỳ xáo trộn là 166. Tại sao điều này có thể xảy ra?
  4. Số lớn nhất bạn có thể tìm thấy có số chu kỳ c nhỏ hơn n , nghĩa là tỷ lệ n / c được tối đa hóa là bao nhiêu?


Ya, đó là nhiều hơn về việc hiển thị kết quả, mặc dù. Câu hỏi này là về việc tạo bảng cho bất kỳ giá trị nào của n ; đó là bản chất toán học hơn.
Todd Lehman

làm tôi bối rối ở đó với các chu kỳ 6/8 trong một thời gian dài được chứng minh :) (tôi nghĩ rằng sự sai sót của tôi là sai). cuối cùng tôi nhìn vào hình ảnh và thấy nó là một chu kỳ 6, vì vậy tôi đã chỉnh sửa nó. vui nhộn
tự hào

@proud haskeller - à vâng, cảm ơn bạn!
Todd Lehman

1
Đây là chuỗi A002326 .
orlp

Câu trả lời:


6

Haskell, 47 46 44 (trong xáo trộn)

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

nhận thức cơ bản là đây là thứ tự 2 trong nhóm mô đun nhân n+1.


1
Bạn có thể loại bỏ l=- biểu thức chính nó là đủ. Đó là một chương trình hợp lệ khi chạy trên dòng lệnh tương tác.
orlp


2

Bình thường, 22 byte

V500,JyhNl{.u.iFc2NJUJ

Dùng thử trực tuyến: Trình diễn . Thay 500 bằng một số nhỏ hơn, nếu quá chậm.

Giải trình:

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
Thật là điên rồ khi một giải pháp thứ ba thực hiện công việc xáo trộn và đếm số sàn thực tế chỉ bằng một nửa so với giải pháp haskell sử dụng một công thức dễ dàng, dự đoán ngay kết quả
Falco

@Falco Tôi biết đúng
tự hào

1
@Falco Tôi thực sự đã cố gắng thực hiện một câu trả lời ngắn gọn nhưng tôi không thể tìm ra cách để làm điều đó. Vì vậy, tôi mới kết thúc cuộc chơi với pyth trong nửa giờ
tự hào

Hãy vui mừng vì bạn đã không thử <> <
Falco

2

Mathicala, 53 (in-shuffle)

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

hoặc, không cách nhau đối kháng

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

Đầu ra:

   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

Mọi mục trong cả hai cột đều được căn giữa theo chiều ngang trong các cột của chúng, nhưng tôi không có khoảng trắng phân đoạn &#8194;... &#8202;ở đây để sao chép điều đó.

Quan sát:

  • Out-shuffle là in-shuffle trên một cỗ bài hai lá bài nhỏ hơn. (Lưu ý rằng thẻ đầu tiên và thẻ cuối cùng ở vị trí cố định trong suốt quá trình trình diễn ngoài luồng.) Do đó, hai lựa chọn sẽ dẫn đến danh sách đầu ra tương tự - cột thứ hai sẽ được dịch chuyển theo một hàng. Về gợi ý "sức mạnh của hai", sự xáo trộn sức mạnh của hai sàn có mô hình {2^n - 2, n}, {2^n, 2n}. (Các cặp ngoài 2^ncùng với n.)
  • Quan sát trong ví dụ trong shuffle rằng khoảng cách 2từ đầu gần nhất của bộ bài tăng gấp đôi ở mỗi bước. {2, 4, 8, 15 = -5, -10, -20}. Trong thực tế, điều này là đúng cho mọi thẻ. Do đó, chúng ta chỉ cần biết sức mạnh nào 2phù hợp với 1mod n+1ở đâu nlà số lượng thẻ. (Lưu ý rằng trong ví dụ, các thẻ trong cột cuối cùng, cột -1, được nhân đôi thành cột áp chót -2, nghĩa 0là phù hợp với một thẻ nhiều hơn trong bộ bài, do đó "mod n+1".) Do đó, MultiplicativeOrder [] chức năng là con đường để đi (trong Mathicala).
  • Theo mặc định, người ta sẽ thử TableForm [] thay vì Grid [], nhưng đầu ra tương tự.

Kết quả ví dụ của bạn có vẻ sai
tự hào

@proudhaskeller: cho xáo trộn hay xáo trộn? Hoặc là được phép. (Và như đã lưu ý, cái này chỉ là một sự thay đổi một hàng ở cột bên phải của cái khác.)
Eric Towers

Cả hai dường như không phù hợp. Tra cứu đầu ra ví dụ trong câu hỏi. Có thể đầu ra ví dụ của bạn sai và mã thực tế là đúng và ví dụ này đã lỗi thời, tôi không biết, nhưng nó dường như không phù hợp.
tự hào

Tự hào: Tôi dường như đã đánh máy đầu ra ví dụ của tôi ở "8". Và lầm bầm trong và ngoài - ít nhất một lần. Chỉnh sửa. Cảm ơn vì đã kiên trì. :-)
Tháp Eric

0

C, 86 (hoặc 84)

Điểm loại trừ khoảng trắng không cần thiết, bao gồm cho rõ ràng.

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

Đây là một xáo trộn, như được chỉ ra bởi những người khác, chỉ là xáo trộn với các thẻ đứng yên ở cả hai đầu bị loại bỏ.

Như được chỉ ra bởi những người khác, trong xáo trộn, vị trí của mỗi thẻ tăng gấp đôi mỗi lần, nhưng điều này phải được thực hiện modulo n+1. Tôi thích nghĩ về vị trí thẻ phụ là vị trí 0 ở bên trái của bảng (bạn có thể nghĩ về điều này khi giữ cả hai thẻ đứng yên từ việc xáo trộn quá). Rõ ràng vị trí của thẻ phải luôn dương, do đó vị trí 0 luôn trống đối với trường hợp xáo trộn.

Mã khởi tạo igiá trị của n. Sau đó, nó nhân với 2, lấy mod kết quả (n+1)và kiểm tra xem liệu iđã trở về giá trị ban đầu chưa ( i-nbằng không.) Nó tăng jcho mỗi lần lặp, ngoại trừ lần lặp cuối (do đó cần khởi tạo jthành 1.)

Về nguyên tắc, icó thể với bất kỳ giá trị nào trong phạm vi 1..n, miễn là so sánh ở cuối được kiểm tra nếu nó được đặt vào cùng một số. Lý do chọn nlà để đảm bảo chương trình hoạt động cho trường hợp n==0. vấn đề là bất kỳ số modulo nào (0+1)đều bằng 0, do đó vòng lặp không bao giờ kết thúc trong trường hợp này nếu iđược khởi tạo thành hằng số như 1.

Các ví dụ câu hỏi bao gồm trường hợp tương đương n==2cho shuffle out, vì vậy nó đã được giải thích rằng trường hợp này là bắt buộc. Nếu không, hai byte n,có thể được lưu bằng cách khởi tạo ithành 1, cùng giá trị như j.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.