Davenport-Schinzel 시퀀스 생성


11

배경

데이븐포트-Schinzel 시퀀스는 두 개의 양의 정수 파라미터 보유 dn. 주어진 매개 변수에 대한 모든 Davenport-Schinzel 시퀀스 세트를로 표시합니다 DS(d,n).

자연수의 모든 시퀀스 고려 1n만족 포함을, :

  • 시퀀스에서 두 개의 연속 된 숫자는 동일하지 않습니다.
  • 보다 큰 길이의 하위 시퀀스 (연속적인 것은 아님)가 없으며 d두 개의 다른 숫자 사이에서 번갈아 나타납니다.

하자 L그러한 시퀀스의 최대 길이를 나타낸다 (부여 d하고 n). 그런 다음 DS(d,n)length가있는 모든 이러한 시퀀스의 집합입니다 L.

몇 가지 예가 도움이 될 수 있습니다. 보자 d = 4, n = 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 및 해당 참조 목록을 참조하십시오.

도전

두 개의 양의 정수가 주어지면 nd에서 Davenport-Schinzel 시퀀스를 생성하십시오 DS(d,n). 이것들은 일반적으로 고유하지 않으므로 유효한 단일 결과를 출력하십시오.

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받아 함수의 결과를 리턴하거나 STDOUT (또는 가장 가까운 대안)에 인쇄하여 프로그램 또는 함수를 작성할 수 있습니다.

편리하고 명확한 문자열 또는 목록 형식을 사용하여 출력 할 수 있습니다.

이것은 코드 골프이므로 가장 짧은 제출 (바이트)이 이깁니다.

시퀀스 길이

서열이 유일하지 않기 때문에,이 과제에서 개별 예에 대해 많이 사용되지는 않는다. 그러나 두 가지 일반적인 유효성 문제는 출력을 확인하기가 매우 쉽기 때문에 주요 질문은 시퀀스의 길이가 올바른지 또는 유효한 시퀀스가 ​​더 긴지 여부입니다. 따라서, 여기에 알려진 목록입니다 (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

파이썬 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입니다.

반복적으로 모든 시퀀스를 만들고 1두 시퀀스로 시작 하고 만족시키는 두 시퀀스를 저장합니다 S. 정렬 순서 (길이 [및 값]별로 정렬)로 작성하므로 마지막 항목은 Davenport-Schinzel-sequence 여야합니다. 좋은 사실을 사용하여 추가하는 동안 목록을 반복 할 수 있습니다.


이미 python2를 사용하고 있다면 (두 공백으로 가정) 탭으로 결합하여 바이트를 절약 할 수 있습니다. 틀 렸으면 말해줘.
Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.