ค้นหา Diffy Games


27

เกมสนุกที่จะเล่นถ้าคุณกำลังเบื่อเป็นเกม Diffy มันเป็นเกมที่ผู้เล่นคนหนึ่งที่เรียบง่ายและสามารถใช้เวลาของคุณ

เกม Diffy นั้นมีลักษณะดังนี้: คุณเริ่มต้นด้วยรายการจำนวนเต็มไม่เป็นลบในตัวอย่างนี้เราจะใช้

3 4 5 8

จากนั้นคุณก็รับผลต่างระหว่างตัวเลขที่อยู่ติดกัน

 (8)  3   4   5   8
    5   1   1   3

จากนั้นคุณทำซ้ำ คุณทำซ้ำจนกว่าคุณจะรู้ว่าคุณได้เข้าสู่วง และโดยทั่วไปเกมจะเริ่มต้นจากจุดเริ่มต้นอีกครั้ง

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

บ่อยครั้งที่เกมไม่มีเป้าหมายคุณเพียงแค่สละเวลากับการคิดเลขในใจ อย่างไรก็ตามเมื่อฉันมีความสุขกับการเล่นเกมนี้เป้าหมายของฉันคือการพยายามเลือกเวลาและพยายามสร้างเกมที่มีช่วงเวลานั้น

ไม่ใช่เกมทุกเกมที่มีเป็นระยะ ๆ ตัวอย่างข้างต้นไม่ได้เป็นระยะ ๆ เนื่องจากในที่สุดมันก็มาถึงเกมที่มีเลขศูนย์ทั้งหมดและทำให้ไม่สามารถกลับไปที่ตำแหน่งเริ่มต้นได้ ในความเป็นจริงดูเหมือนว่าเกมส่วนใหญ่นั้นไม่ได้เป็นระยะทำให้บางเกมเป็นอัญมณีหายาก


ให้เกมที่วนซ้ำในช่วงเวลาหนึ่งมันเป็นเรื่องไม่สำคัญที่จะสร้างอีกเกมที่วนซ้ำในช่วงเวลาเดียวกันโดยเพิ่มลำดับเป็นสองเท่า ตัวอย่างเช่นเกม:

1 0 1

เล่นเหมือนกันกับเกม:

1 0 1 1 0 1

ในความเป็นจริงเราสามารถพิจารณาได้ว่าทั้งคู่เป็นเกมที่เล่นซ้ำอย่างไม่สิ้นสุด:

... 1 0 1 ...

เราจะพิจารณาเกมหนึ่งเกมเพื่อความท้าทายนี้

ในทำนองเดียวกันการคูณลำดับทั้งหมดด้วยค่าคงที่จะรักษาระยะเวลาไว้เล็กน้อยดังนั้นเราจะนับเกมสองเกมที่แตกต่างกันโดยปัจจัยคงที่ให้เป็นเกมเดียวกันอีกครั้ง


สตริงที่ไม่สิ้นสุด... 1 0 1 ...และ... 0 1 1 ...เห็นได้ชัดว่าเป็นสตริงเดียวกันที่เลื่อนโดยอักขระหนึ่งตัว เราจะไม่นับเกมเหล่านี้เป็นเกมที่แตกต่างกัน แต่เมื่อเกมหนึ่งเข้ามาถึงเกมอื่นมันจะไม่ถือว่าเป็นการสิ้นสุดรอบเมื่อพิจารณารอบเวลาของเกม ตัวอย่างเช่น:

เกมสองเกม

... 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

เป็นทั้งเกมที่มีช่วงเวลา 6 พวกเขาไม่มีคำศัพท์ซึ่งกันและกันที่จุดใด ๆ ในลูปของพวกเขา (ซึ่งแตกต่างกัน... 1 1 0 ...และ... 1 0 1 ...ถึงกัน) แต่เนื่องจากพวกเขาเปลี่ยนเวอร์ชั่นของกันและกันพวกมันจะถือว่าเป็นเกมเดียวกันเมื่อนับ


การสะท้อนกลับ (หรือการย้อนกลับ) สตริงที่ไม่สิ้นสุดให้ความสำคัญกับพฤติกรรมเดียวกัน แต่ไม่จำเป็นต้องให้ช่วงเวลาเดียวกัน ยกตัวอย่างเช่น

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

และการสะท้อนของมัน

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

หากเราพิจารณาคนรุ่นต่อไปที่จะผลิตที่จุดกึ่งกลางระหว่างตัวละคร:

... 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 ...

จากนั้นทั้งคู่จะเปลี่ยนตำแหน่ง 3.5 องค์ประกอบ อย่างไรก็ตามเราไม่พิจารณารุ่นต่อไปที่จะผลิตด้วยการชดเชยองค์ประกอบครึ่งดังนั้นหนึ่งรอบถึงการเปลี่ยนแปลง 4 องค์ประกอบให้ระยะเวลา 15 และรอบอื่น ๆ ลงไปที่การเปลี่ยนแปลงองค์ประกอบ 3 ให้ระยะเวลา จาก 5

ด้วยเหตุนี้เราจึงพิจารณาสตริงที่ไม่สมมาตรและการสะท้อนกลับของมันจะแตกต่างกันแม้ว่าวัฏจักรจะมีความหมายบางประการ แน่นอนถ้าพวกเขาเป็นส่วนหนึ่งของวงจรเดียวกันมันจะนับเป็นรอบเดียวเท่านั้น


ด้วยข้อ จำกัด เหล่านี้คณิตศาสตร์เพียงเล็กน้อยก็สามารถแสดงให้เห็นว่าในความเป็นจริงมีจำนวน จำกัด ของวงจร Diffy กับช่วงเวลา จำกัด ใด ๆ ก็ตาม ยิ่งกว่านั้นทุก ๆ สตริงอนันต์ที่มีคาบ จำกัด คือการวนซ้ำไม่สิ้นสุดของสตริง จำกัด

โปรดทราบว่าสตริงสามารถมีขนาดใหญ่กว่าหรือสั้นกว่าระยะเวลา ตัวอย่างเช่นมีสตริงของความยาว 5 ที่มีระยะเวลา 15 และสตริงของความยาว 15 ที่มีระยะเวลา 5 สตริงทั้งหมดที่มีระยะเวลา 19 มีความยาว 9709

งาน

รับจำนวนnดังกล่าว n ที่มีขนาดใหญ่กว่า 1 ผ่านทางวิธีการป้อนข้อมูลมาตรฐานกำหนดจำนวนรอบ Diffy nที่แตกต่างกันที่มีระยะเวลาของการตรง

(ดูเหมือนว่าในวรรณคดี0มักจะไม่ถือว่าเป็นเกม Diffy เป็นระยะเนื่องจากนี่เป็นพื้นที่สีเทาฉันจะไม่ขอให้คุณแก้ไขn = 1)

นี่คือดังนั้นเป้าหมายคือเพื่อลดจำนวนไบต์ในซอร์สโค้ดของคุณ

กรณีทดสอบ

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

คำแนะนำ

เกมแบบกระจายตามช่วงเวลาทั้งหมดจะมีศูนย์และค่าคงที่เดียวหมายความว่าทุกเกมในช่วงเวลาจะมีความผิดปกติในบางเกมที่มีความต่างกันซึ่งประกอบด้วยศูนย์และเกม


ตกลงฉันได้สร้างห้องแชท: chat.stackexchange.com/rooms/56459/diffy-games
Peter Taylor

มี010001->111001->000101->100111->010100->011110->010001และ110110->101101->011011->110110ที่แตกต่างกัน?
Mirac7

@ Mirac7 ขออภัยมานานแล้วฉันค่อนข้างแน่ใจว่าเกมเหล่านั้นมีความแตกต่าง
Wheat Wizard

คำตอบ:


6

Python 2 , 181 ไบต์

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))

ลองออนไลน์!

มันทำงานอย่างไร

กฎที่แปลงแต่ละแถวของเกมที่แตกต่างแบบไบนารีลงในแถวถัดไปจะเหมือนกับกฎที่แปลงแต่ละคอลัมน์เป็นคอลัมน์ถัดไป ดังนั้นจึงพอเพียงที่จะพบว่ารอบที่แตกต่างกันทั้งหมดภายในกราฟของทุก length- ยอมรับnคอลัมน์ที่คอลัมน์คือ“บัญญัติ” ถ้ามันเป็น lexicographically ขนาดเล็กกว่าทั้งหมดของการหมุนของมัน (คอลัมน์นี้โดยอัตโนมัติไม่รวมกับระยะเวลาที่มีขนาดเล็กกว่าn )

ด้วยคอลัมน์ที่แสดงเป็นเลขฐานสอง 0 ≤ i <2 nกฎส่งiไปยังการหมุนที่เล็กที่สุดของi XOR ( i ⋅2) (ถ้าฉันเป็นที่ยอมรับเป็นบิตสูงเป็นศูนย์และเราไม่จำเป็นต้องกังวลเกี่ยวกับวิจิตรที่นี่)

ดังนั้นเราจึงวนรอบคอลัมน์ที่เป็นไปได้ทั้งหมดiตรวจสอบ canonicity จากนั้นใช้กฎซ้ำ ๆ จนกว่าเราจะพบคอลัมน์ที่เราเคยเยี่ยมชมมาก่อนบันทึกคอลัมน์แรกที่เข้ามาเช่นนั้น หนึ่งคอลัมน์ในแต่ละรอบจะเป็นคอลัมน์แรกที่เข้ามา


1
มันทำงานอย่างไร
ข้าวสาลีช่วยสร้าง

@WheatWizard เพิ่มคำอธิบายแล้ว
Anders Kaseorg

งานที่ดี! คุณได้รับเงินรางวัล @AndersKaseorg
FantaC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.