Davenport-Schinzelシーケンスを生成する


11

バックグラウンド

ダヴェンポート-Schinzel配列は、 2つの正の整数パラメータを有しているdn。によって、指定されDS(d,n)たパラメータのすべてのDavenport-Schinzelシーケンスのセットを示します。

自然数の全てのシーケンスを考えてみましょう1n満足している、包括的、:

  • シーケンス内の連続する2つの番号は同一ではありません。
  • より大きい長さのサブシーケンス(連続している必要はありません)はありませんd

Lこのようなシーケンスの最大長を指定してみましょう(dn)。次に、DS(d,n)長さを持つそのようなすべてのシーケンスのセットですL

いくつかの例が役立つかもしれません。ましょうd = 4n = 3。これらの制約のある最長のシーケンスには、がありL = 8ます。したがって、以下はのメンバーですDS(4,3)

[1, 2, 1, 3, 1, 3, 2, 3]

連続する同一の番号はなく、lengthの交互のサブシーケンスがあります4が、より長いサブシーケンスはありません。

 1  2  1           2
 1  2        1     2
 1        3  1  3
 1        3  1        3
    2     3        2  3
    2           3  2  3
       1  3  1  3
       1  3  1        3

以下の例がありませんDS(4,3)

[1, 2, 2, 3, 1, 3, 2, 3]  # Two consecutive 2's.
[1, 2, 1, 3, 1, 3, 2, 1]  # Contains alternating subsequences of length 5.
[1, 2, 1, 3, 1, 3, 2]     # Longer valid sequences for d = 4, n = 3 exist.

詳細については、MathWorldOEIS、およびそれらがリストするリファレンスを参照してください。

チャレンジ

2つの正の整数とが与えられた場合、ndDavenport-Schinzelシーケンスを生成しDS(d,n)ます。これらは一般的に一意ではないため、有効な結果が1つでも出力されることに注意してください。

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、関数から結果を返すか、STDOUT(または最も近い代替)に結果を出力できます。

出力には、便利で明確な文字列またはリスト形式を使用できます。

これはコードゴルフなので、最短の提出(バイト単位)が勝ちです。

シーケンス長

シーケンスは一意ではないため、この課題では個々の例の使用はあまりありません。ただし、2つの一般的な有効性の問題は、出力を確認するのが非常に簡単であるため、主な問題は、シーケンスの長さが正しいか(または有効なシーケンスがより長いか)だけです。したがって、ここでの既知のリストである1が L与えられたためdn

 \ 
 d\n 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
   \-----------------------------------------------------------
 1 | 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 2 | 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
 3 | 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
 4 | 1  4  8 12 17 22 27 32 37 42 47 53 58 64 69 75 81 86 92 98
 5 | 1  5 10 16 22 29 ...
 6 | 1  6 14 23 34 ...
 7 | 1  7 16 28 41 ...
 8 | 1  8 20 35 53 ...
 9 | 1  9 22 40 61 ...
10 | 1 10 26 47 73 ...

この表の情報を提出物にハードコードしてはいけません。

1この表は1994年のものであるため、それ以降はさらに進歩している可能性がありますが、提出物が妥当な時間内にこの表のさらに大きなエントリを処理できるとは思えません。

回答:


2

Python 2:172

from itertools import*
d,n=input();S=[[1]]
for s in S:
 for v in range(1,n+1):
  if(v!=s[-1])*all(w[2:]!=w[:-2]for w in combinations(s+[v],d+1)):S.append(s+[v])
print S[-1]

入力は単に形式です4, 3

12つのプロパティで始まり、2つのプロパティを満たすすべてのシーケンスを繰り返し作成し、に保存しますS。私はそれらをソートされた順序(長さ[および値]でソート)で作成するため、最後のエントリはDavenport-Schinzel-sequenceでなければなりません。リストに追加しながらリストを反復処理できるという素晴らしい事実を使用します。


すでにpython2を使用している場合は、(2つのスペースと想定される)タブに結合することで1バイトを節約できます。私が間違っている場合は修正してください。
ザカリー16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.