Tìm trò chơi Diffy


27

Một trò chơi thú vị để chơi nếu bạn chán là Trò chơi Diffy . Đây là một trò chơi một người chơi khá đơn giản và có thể tiêu tốn rất nhiều thời gian của bạn.

Trò chơi Diffy hoạt động như sau: Bạn bắt đầu với một danh sách các số nguyên không âm, trong ví dụ này chúng tôi sẽ sử dụng

3 4 5 8

Sau đó, bạn lấy sự khác biệt tuyệt đối giữa các số liền kề

 (8)  3   4   5   8
    5   1   1   3

Sau đó, bạn lặp lại. Bạn lặp lại cho đến khi bạn nhận ra bạn đã bước vào một vòng lặp. Và sau đó nói chung trò chơi bắt đầu lại từ đầu.

3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0

Thường thì trò chơi không có mục tiêu, bạn chỉ chờ đợi thời gian bằng cách làm số học trong đầu. Tuy nhiên, khi tôi có niềm vui khi chơi trò chơi này, mục tiêu của tôi là luôn cố gắng chọn một giai đoạn và cố gắng xây dựng một trò chơi lặp lại với khoảng thời gian cụ thể đó.

Không phải tất cả các trò chơi là định kỳ, ví dụ ở trên không phải là định kỳ vì cuối cùng nó cũng đến một trò chơi với tất cả các số không và do đó không bao giờ có thể đưa nó trở lại vị trí bắt đầu. Trong thực tế, có vẻ như phần lớn các trò chơi không phải là định kỳ làm cho một vài trò chơi là một viên ngọc quý hiếm.


Với một trò chơi lặp lại với một khoảng thời gian cụ thể, việc tạo ra một trò chơi khác lặp lại với cùng một khoảng thời gian là điều không quan trọng bằng cách nhân đôi chuỗi. Ví dụ: trò chơi:

1 0 1

Chơi giống hệt như trò chơi:

1 0 1 1 0 1

Trên thực tế, chúng ta có thể xem xét rằng cả hai thực sự là trò chơi lặp lại vô hạn:

... 1 0 1 ...

Chúng tôi sẽ xem xét họ một trò chơi vì lợi ích của thử thách này.

Theo cách tương tự nhân toàn bộ chuỗi với một hằng số cũng sẽ bảo toàn khoảng thời gian một cách tầm thường để chúng ta một lần nữa sẽ tính bất kỳ hai trò chơi khác nhau bởi một yếu tố không đổi là cùng một trò chơi.


Các chuỗi vô hạn ... 1 0 1 ...... 0 1 1 ...rõ ràng là cùng một chuỗi được dịch chuyển bởi một ký tự. Chúng tôi sẽ không tính những trò chơi này là các trò chơi khác nhau, nhưng khi trò chơi này đến trò chơi khác, nó sẽ không được coi là kết thúc chu kỳ khi xác định thời gian của trò chơi. Ví dụ:

Hai trò chơi

... 0 0 0 1 0 1 ...  = A
... 0 0 1 1 1 1 ...  = B
... 0 1 0 0 0 1 ...  = A << 4
... 1 1 0 0 1 1 ...  = B << 4
... 0 1 0 1 0 0 ...  = A << 2
... 1 1 1 1 0 0 ...  = B << 2

... 0 0 1 0 1 0 ...  = A << 1
... 0 1 1 1 1 0 ...  = B << 1
... 1 0 0 0 1 0 ...  = A << 5
... 1 0 0 1 1 1 ...  = B << 5
... 1 0 1 0 0 0 ...  = A << 3
... 1 1 1 0 0 1 ...  = B << 3

là cả hai trò chơi với giai đoạn 6. Chúng không chia sẻ bất kỳ thời hạn nào với nhau tại bất kỳ điểm nào trong các vòng lặp của chúng (không giống nhau ... 1 1 0 ...... 1 0 1 ...tiếp cận nhau) nhưng vì chúng là các phiên bản thay đổi của nhau nên chúng được coi là cùng một trò chơi khi đếm.


Phản ánh (hoặc đảo ngược) một chuỗi vô hạn về cơ bản cho cùng một hành vi, nhưng không nhất thiết phải đưa ra cùng một khoảng thời gian. Hãy xem xét, ví dụ,

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...

và sự phản ánh của nó

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...

Nếu chúng ta coi thế hệ tiếp theo sẽ được sản xuất ở điểm giữa các nhân vật:

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...
 ... 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 ...

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...
 ... 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 ...

sau đó cả hai sẽ thay đổi vị trí của 3,5 yếu tố. Tuy nhiên, chúng tôi không coi thế hệ tiếp theo được tạo ra với phần bù nửa phần tử đó, do đó, một vòng làm thay đổi 4 phần tử trong khoảng thời gian 15 và các phần còn lại chuyển sang phần 3 phần tử trong một khoảng thời gian của 5.

Vì lý do này, chúng tôi coi một chuỗi không đối xứng và sự phản xạ của nó là khác biệt, mặc dù các chu kỳ theo một nghĩa nào đó là đẳng cấu. Tất nhiên, nếu chúng tạo thành một phần của cùng một chu kỳ thì nó chỉ được tính là một chu kỳ.


Với những hạn chế này, toán học nhỏ có thể chỉ ra rằng trên thực tế có một số hữu hạn các chu kỳ Diffy với bất kỳ khoảng thời gian hữu hạn nào. Hơn nữa, mỗi chuỗi vô hạn có chu kỳ hữu hạn là sự lặp lại vô hạn của một chuỗi hữu hạn.

Lưu ý rằng các chuỗi có thể lớn hơn hoặc ngắn hơn các khoảng thời gian. Ví dụ: có một chuỗi có độ dài 5 với chu kỳ 15 và một chuỗi có độ dài 15 với chu kỳ 5. Tất cả các chuỗi có chu kỳ 19 có độ dài 9709.

Bài tập

Cho một số nsao cho n lớn hơn 1 thông qua các phương thức nhập chuẩn xác định số chu kỳ Diffy khác biệt với một khoảng thời gian chính xác n.

(Dường như, trong tài liệu, 0thường không được coi là một trò chơi Diffy định kỳ. Vì đây là một khu vực màu xám nên tôi sẽ không yêu cầu bạn giải quyết n = 1)

Đây là , vì vậy mục tiêu là giảm thiểu số lượng byte trong mã nguồn của bạn.

Các trường hợp thử nghiệm

2  ->   0
3  ->   1
4  ->   0
5  ->   1
6  ->   1
7  ->   3
8  ->   0
9  ->   4
10 ->   4
11 ->   3
12 ->   5
13 ->   5
14 ->  24
15 ->  77
16 ->   0
17 -> 259
18 -> 259
19 ->  27
20 -> 272
21 -> 811
22 -> 768
23 ->  91
24 -> 340
25 -> 656

Gợi ý

Tất cả các trò chơi khác nhau định kỳ sẽ chỉ chứa số không và một hằng số duy nhất, điều này có nghĩa là mọi trò chơi định kỳ sẽ đồng hình với một số trò chơi khác biệt chỉ bao gồm số không và số không.


Ok, tôi đã tạo một phòng trò chuyện: chat.stackexchange.com/rooms/56459/diffy-games
Peter Taylor

Được 010001->111001->000101->100111->010100->011110->010001110110->101101->011011->110110khác biệt?
Mirac7

@ Mirac7 Xin lỗi đã quá lâu, tôi khá chắc chắn những trò chơi đó rất khác biệt
Wheat Wizard

Câu trả lời:


6

Python 2 , 181 byte

n=input()
m=2**n
a=[m]*m
r=lambda i:[i*-~m>>k&m-1 for k in range(n)]
def s(i):
 if a[i]&m:a[i]=i;a[i]=s(min(r(i^i*2)))
 return a[i]
print sum(min(r(i)[1:])>i==s(i)for i in range(m))

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Các quy tắc chuyển đổi từng hàng của trò chơi khác biệt nhị phân thành hàng tiếp theo giống như các quy tắc chuyển đổi từng cột thành cột tiếp theo. Do đó, nó cũng đủ để tìm tất cả các chu kỳ khác nhau trong biểu đồ của tất cả các length- kinh điển n cột, nơi một cột là “kinh điển” nếu nó là thứ tự từ điển nhỏ hơn so với tất cả các phép quay của nó (điều này tự động không bao gồm các cột với khoảng thời gian nhỏ hơn n ).

Với các cột được biểu diễn dưới dạng số nhị phân 0 i <2 n , quy tắc sẽ gửi i đến vòng quay nhỏ nhất của i XOR ( i ⋅2). (Nếu tôi là hợp quy, bit cao của nó bằng 0 và chúng ta không cần phải lo lắng về sự bao bọc ở đây.)

Vì vậy, chúng tôi lặp qua tất cả các cột i có thể , kiểm tra mức độ cano, sau đó liên tục áp dụng quy tắc cho đến khi chúng tôi tìm thấy một cột chúng tôi đã truy cập trước đó, ghi nhớ cột được xem xét lại đầu tiên như vậy. Chính xác một cột trong mỗi chu kỳ sẽ là cột được xem xét lại đầu tiên của chính nó.


1
Cái này hoạt động ra sao?
Thuật sĩ lúa mì

@WheatWizard Đã thêm một lời giải thích.
Anders Kaseorg

Công việc tốt! Bạn đã kiếm được tiền thưởng. @AndersKaseorg
FantaC
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.