Diffy Oyunları Bul


27

Eğer sıkılırsanız oynamak için eğlenceli bir oyun Diffy Oyunu . Oldukça basit ve zamanınızın büyük bir kısmını tüketebilen tek oyunculu bir oyundur.

Diffy oyunu aşağıdaki gibi çalışır: Negatif olmayan tam sayıların bir listesiyle başlarsınız, bu örnekte kullanacağız

3 4 5 8

Sonra bitişik sayılar arasındaki mutlak farkı alırsın

 (8)  3   4   5   8
    5   1   1   3

O zaman tekrar et. Bir döngü girdiğinizi farkedene kadar tekrar edersiniz. Ve sonra genel olarak oyun yeniden en baştan başlar.

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

Genellikle oyunun bir amacı yoktur, sadece kafanızdaki aritmetik işlemlerle zaman geçirirsiniz. Ancak bu oyunu oynamaktan zevk duyduğumda hedefim her zaman bir periyodu denemek ve seçmek ve o belirli periyodda geçen bir oyun kurmaya çalışmaktır.

Tüm oyunlar periyodik değildir, örneğin yukarıdaki sonuç periyodik değildir, çünkü sonunda tüm oyunların sıfır olduğu bir oyuna ulaşır ve bu nedenle başlangıç ​​pozisyonuna asla geri dönemez. Aslında, oyunların büyük çoğunluğunun nadir bir mücevher olan birkaç oyunu yapmak için periyodik olmadığı görülüyor.


Belirli bir süre ile geçen bir oyun göz önüne alındığında, aynı süre ile sadece iki katına çıkarak tekrarlanan başka bir oyun yapmak çok önemlidir. Örneğin oyun:

1 0 1

Oyun ile tamamen aynı şekilde oynanır:

1 0 1 1 0 1

Aslında, ikisinin de gerçekten sonsuz tekrarlayan bir oyun olduğunu düşünebiliriz:

... 1 0 1 ...

Onları bu mücadelenin uğruna bir oyun olarak göreceğiz.

Benzer bir şekilde, tüm sekansı bir sabit ile çarpmak aynı zamanda zaman dilimini de önemsiz şekilde koruyacaktır; bu nedenle, aynı oyun olarak sabit bir faktöre göre farklılık gösteren iki oyunu bir kez daha sayacağız.


Sonsuz dizeler ... 1 0 1 ...ve ... 0 1 1 ...açıkça bir karakter tarafından değiştirilen aynı dizedir. Bunları farklı oyunlar olarak saymayacağız, ancak biri diğerine ulaştığında, oyunun süresini belirlerken bu döngünün sonu sayılmaz. Örneğin:

İki oyun

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

ve

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

Her ikisi de 6. periyodu olan oyunlardır. Döngülerinin hiçbir noktasında birbirleriyle hiçbir terim paylaşmazlar (birbirinden farklı ... 1 1 0 ...ve ... 1 0 1 ...birbirlerine ulaşırlar) ancak birbirlerinin farklı sürümleri oldukları için sayma sırasında aynı oyun olarak kabul edilirler.


Sonsuz bir dizgeyi yansıtmak (veya tersine çevirmek) esasen aynı davranışı verir, ancak mutlaka aynı süreyi vermez. Düşünün, örneğin

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

ve onun yansıması

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

Yeni neslin, karakterler arasında yarı yolda üretileceğini düşünürsek:

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

o zaman her ikisi de 3.5 eleman tarafından kaydırılmış pozisyonda olacaktı. Bununla birlikte, bir sonraki neslin bu yarım eleman ofseti ile üretileceğini düşünmüyoruz, bu yüzden biri 15 periyot veren 4 elementli bir kaymaya, diğeri ise 3 element kaymaya kadar olan bir periyot vererek 5.

Bu nedenle, döngüleri bir anlamda izomorfik olsa da, asimetrik bir dize ve yansımasının belirgin olduğunu düşünüyoruz. Elbette, aynı döngünün bir parçasını oluştururlarsa, o zaman sadece bir döngü olarak sayılır.


Bu kısıtlamalarla, küçük bir matematik aslında herhangi bir sonlu periyodda sınırlı sayıda Diffy döngüsü olduğunu gösterebilir. Dahası, sonlu bir periyodu olan her sonsuz dizi bir sonlu dize sonsuz tekrarıdır.

Dizelerin noktalardan daha büyük veya daha kısa olabileceğini unutmayın. Örneğin, 15 periyodu olan bir 5 uzunluğu ve 5 periyodu olan bir 15 nolu uzunluğu vardır.

Görev

nStandart giriş yöntemleri ile n'nin 1'den büyük olduğu bir sayı verildiğinde , tam olarak bir periyod ile farklı Diffy döngülerinin sayısını belirler n.

(Görünüşe göre, literatürde, 0genellikle periyodik bir Diffy oyunu sayılmaz. Bu gri bir alan olduğu için çözmenizi istemeyeceğim n = 1)

Bu , bu nedenle amaç kaynak kodunuzdaki bayt sayısını en aza indirmektir.

Test Kılıfları

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

İpuçları

Tüm Periyodik fark oyunları sadece sıfır ve tek bir sabit içerecektir, bu, her periyodik oyunun sadece sıfırlardan ve bazılardan oluşan farklı oyunlara izomorfik olacağı anlamına gelir.


Tamam, bir sohbet odası oluşturdum: chat.stackexchange.com/rooms/56459/diffy-games
Peter Taylor

Are 010001->111001->000101->100111->010100->011110->010001ve 110110->101101->011011->110110farklı?
Mirac7

@ Mirac7 Maalesef çok uzun zaman oldu, bu oyunların farklı olduğundan eminim
Wheat Wizard

Yanıtlar:


6

Python 2,181 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Bir ikili farklılık oyununun her satırını bir sonraki satıra dönüştüren kurallar, her sütunu bir sonraki sütuna dönüştüren kurallarla aynıdır. Bu nedenle, tüm standart uzunluk- grafiğinin içindeki tüm farklı döngüleri bulmak için yeterli olmaktadır , n de (daha az bir süre ile, bu, otomatik olarak hariç sütun bulunan döndürme tüm daha sözlük sırasında daha küçük ise, bir sütun “kanonik” bir sütun, n ).

İkili sayılar 0 ≤ i <2 n olarak gösterilen sütunlarla , kural i'yi i XOR ( i ⋅2) ' nin en küçük dönüşüne gönderir . (Eğer ben kanonik ise, kendi yüksek bit sıfırdır ve burada wraparound hakkında endişe gerekmez.)

Tüm olası sütunlar aracılığıyla biz döngü Yani ben , canonicity kontrol biz önce ziyaret ettiği bir sütun bulana kadar, daha sonra art arda bu tür ilk Revisited sütunu memoizing, kuralı geçerlidir. Tam olarak her döngüdeki bir sütun, kendi ilk gözden geçirilmiş sütunu olacaktır.


1
Bu nasıl çalışıyor?
Buğday Sihirbazı

@WheatWizard Bir açıklama eklendi.
Anders Kaseorg

İyi iş! Ödül kazandın. @AndersKaseorg
FantaC
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.