同色の算術級数


15

ファンデルワーデンの定理によると

与えられた正の整数rkに対してN、整数{1, 2, ..., N}がそれぞれr 異なる色のいずれかで色付けされている場合、kすべて同じ色の算術級数で少なくとも整数があるような数があります。最小のものNは、ファン・デル・ワーデン数W(r, k)です。

あなたの目標は、W(r, k)正の整数入力rとを与えられたファンデルワーデン数を計算することkです。少ないバイトが勝ちます。

この関数は非常に急速に成長し、計算に時間がかかることに注意してください。でもW(4, 4)不明です。無制限のリソース(時間、メモリ、スタックの深さなど)を備えた理想的なコンピューターでコードを実行すると想定できます。あなたのコードは理論的には答えが分からない値に対しても正しい答えを与えなければなりません。

この関数を計算する組み込み関数は許可されていません。

ためのr = 2色と長さの進行k = 3、長さ-が存在する8ような進行を回避する配列、すなわち3同じ色の等間隔の要素:

B R R B B R R B

しかし、そのような長さの9シーケンスはありませんW(2, 3) == 9。例えば、

R B B R B R R B R
  ^     ^     ^      

表示されている長さ3と同色の算術級数が含まれています。

テストケース

おそらく、小さなケースのみをテストできます。

+-----+-----+-----+-----+-----+-----+------+
|     | k=1 | k=2 | k=3 | k=4 | k=5 | k=6  |
+-----+-----+-----+-----+-----+-----+------+
| r=1 |   1 |   2 |   3 |   4 |   5 |    6 |
| r=2 |   1 |   3 |   9 |  35 | 178 | 1132 |
| r=3 |   1 |   4 |  27 | 293 |     |      |
| r=4 |   1 |   5 |  76 |     |     |      |
+-----+-----+-----+-----+-----+-----+------+

回答:


7

Python 3.5、125 124 119バイト

f=lambda r,k,*L:any(L[:x*k:x]==k*(*{*L[:x*k:x]},)for x in range(1,len(L)+1))*len(L)or max(f(r,k,i,*L)for i in range(r))

面白いのは、これをゴルフする過程で、プログラムが実際に 、より効率的。とはいえ、それf(2,4)以上のことf(3,3)は永遠に続きます。

説明

初期バージョンではk、可能なすべての開始インデックスとステップを試行して、シーケンスに長さの進行が含まれているかどうかを確認しました。

def f(r,k,L=[]):
 for i in range(len(L)):
  for j in range(len(L)):
   if len(set(L[i::j+1]))==1 and len(L[i::j+1])==k:
    return len(L)
 return max(f(r,k,L+[i])for i in range(r))

ゴルフバージョンでは、新しいシーケンス要素が追加されるため、可能なすべての手順を試すだけで済みます。のx*kキャップのような例の世話をすることで[0, 0, 1]長さ2の進行が含まれていますが、キャップされていない一意性チェックを満たしていないだろう、。

チェックは

L[:x*k:x]==k*(*{*L[:x*k:x]},)

ゴルフバージョンの最初のパスでは、Lが空の場合、len(L)0です。したがって、後半orは常に実行されます。その後Lは空ではないため、{*L[:x*k:x]}(これはPython 3.5のみですset(L[:x*k:x]))少なくとも1つの要素があります。

以来、L[:x*k:x]最大で持つことができるk要素とのためのL非空のk*(*{*L[:x*k:x]},)少なくとも有するk要素正確ある場合、2つだけ等しくすることができk、両方の要素は。これを実現するに{*L[:x*k:x]}は、要素が1つだけである必要があります。つまり、進行中の色は1つだけです。

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