難しいゲームを探す


27

あなたが退屈している場合にプレイする楽しいゲームは、Diffy Gameです。それは非常にシンプルで、多くの時間を消費できるワンプレイヤーゲームです。

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

多くの場合、ゲームには目標がなく、頭の中で算術を行うことで時間を割いています。しかし、このゲームをプレイする喜びがあるとき、私の目標は常にある期間を選択して、その特定の期間でループするゲームを構築することです。

すべてのゲームが定期的であるわけではありません。たとえば、上の例は最終的にすべてゼロのゲームに到達し、開始位置に戻せないため、定期的ではありません。実際、ほとんどのゲームは、まれな宝石であるいくつかのゲームを定期的に作っているわけではないようです。


特定の期間でループするゲームを考えると、シーケンスを2倍にするだけで同じ期間でループする別のゲームを作成するのは簡単です。たとえば、ゲーム:

1 0 1

ゲームとまったく同じようにプレイします。

1 0 1 1 0 1

実際、両方が実際に無限に繰り返されるゲームであると考えることができます。

... 1 0 1 ...

この課題のために、それらを1つのゲームと見なします。

同様に、シーケンス全体に定数を乗算すると、期間が自明に保存されるため、一定の要因で異なる2つのゲームを同じゲームであると再度​​カウントします。


無限文字列... 1 0 1 ...... 0 1 1 ...は、明らかに1文字シフトされた同じ文字列です。これらを異なるゲームとしてカウントしませんが、一方が他方に到達しても、ゲームの期間を決定する際にサイクルの終わりとはみなされません。例えば:

2つのゲーム

... 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の要素だけ位置がシフトします。ただし、次の世代はその半要素オフセットで生成されるとは考えないため、1つは4要素シフトに切り上げられ、期間は15になり、もう1つは3要素シフトに切り下げられて期間が与えられます5。

このため、サイクルが何らかの意味で同型であっても、非対称ストリングとその反射は明確であると考えます。もちろん、それらが同じサイクルの一部を形成する場合、それは1サイクルとしてのみカウントされます。


これらの制限により、実際には、任意の有限期間で有限数のDiffyサイクルが存在することを少し数学的に示すことができます。さらに、有限の周期を持つ無限ストリングはすべて、有限ストリングの無限の繰り返しです。

文字列は、ピリオドより大きくても短くてもかまいません。たとえば、期間15の長さ5のストリングと期間5の長さ15のストリングがあります。期間19のストリングはすべて長さが9709です。

仕事

数所与のn正確の期間と異なるDiffyサイクルの数を決定する標準的な入力方法を介して1より大きくなるようNこと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

ヒント

すべての定期的なdiffyゲームには、ゼロと1つの定数のみが含まれます。つまり、すべての定期的なゲームは、0と1のみで構成されるいくつかのdiffyゲームと同形になります。


OK、チャットルームを作成しました:chat.stackexchange.com/rooms/56459/diffy-games
ピーターテイラー

ある010001->111001->000101->100111->010100->011110->010001110110->101101->011011->110110明確な?
Mirac7

@ Mirac7ごめんなさい、とても長い間、それらのゲームははっきりしていると確信しています
ウィートウィザード

回答:


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

オンラインでお試しください!

使い方

バイナリdiffyゲームの各行を次の行に変換するルールは、各列を次の列に変換するルールと同じです。したがって、すべての標準的な長さn列のグラフ内ですべての個別のサイクルを検索するだけで十分です。列がすべての回転より辞書式に小さい場合、列は「標準」です(これは周期がnより小さい列を自動的に除外します)。

列は二進数0≤として表すと、I <2 N、ルールは、送信Iを最小の回転I XOR(I ⋅2)。(iが標準の場合、その上位ビットはゼロであり、ここでラップアラウンドを心配する必要はありません。)

したがって、可能なすべての列iをループし、正規性を確認し、前に訪れた列が見つかるまでルールを繰り返し適用し、最初にそのような再訪した列をメモします。各サイクルの正確に1つの列が、最初の再訪列になります。


1
これはどのように作動しますか?
小麦ウィザード

@WheatWizard説明を追加しました。
アンダースカセオルグ

良くやった!あなたは賞金を獲得しました。@AndersKaseorg
FantaC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.