Tạo chuỗi Davenport-Schinzel


11

Lý lịch

Một chuỗi Davenport-Schinzel có hai tham số nguyên dương dn. Chúng tôi sẽ biểu thị tập hợp tất cả các chuỗi Davenport-Schinzel cho các tham số đã cho bằng cách DS(d,n).

Hãy xem xét tất cả các trình tự của các số tự nhiên 1đến n, bao gồm, mà đáp ứng:

  • Không có hai số liên tiếp trong chuỗi giống hệt nhau.
  • Không có phần tiếp theo (không nhất thiết phải liên tiếp) có độ dài lớn hơn d, xen kẽ giữa hai số khác nhau.

Hãy Lbiểu thị độ dài tối đa của một chuỗi như vậy (đã cho dn). Sau đó, DS(d,n)là tập hợp của tất cả các chuỗi như vậy với chiều dài L.

Một số ví dụ có thể giúp đỡ. Hãy d = 4, n = 3. Trình tự dài nhất có thể với những ràng buộc này có L = 8. Vì vậy, sau đây là một thành viên của DS(4,3):

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

Không có các số giống hệt nhau liên tiếp và có các dãy dài xen kẽ 4, nhưng không dài hơn:

 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

Các ví dụ sau không có trong 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.

Để biết thêm thông tin, hãy xem MathWorldOEIS và các tài liệu tham khảo mà họ liệt kê.

Các thách thức

Cho hai số nguyên dương ndtạo ra bất kỳ chuỗi Davenport-Schinzel nào DS(d,n). Lưu ý rằng những điều này thường không phải là duy nhất, do đó, hãy đưa ra bất kỳ kết quả hợp lệ nào.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và trả về kết quả từ hàm hoặc in ra STDOUT (hoặc thay thế gần nhất).

Bạn có thể sử dụng bất kỳ định dạng danh sách hoặc chuỗi thuận tiện, rõ ràng cho đầu ra.

Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.

Độ dài trình tự

Vì các chuỗi không phải là duy nhất, không có nhiều sử dụng cho các ví dụ riêng lẻ trong thử thách này. Tuy nhiên, hai vấn đề về tính hợp lệ chung là khá dễ dàng để kiểm tra bất kỳ đầu ra nào, vì vậy câu hỏi chính chỉ là liệu chuỗi có độ dài phù hợp hay không (hoặc có một chuỗi hợp lệ dài hơn). Do đó, đây là danh sách 1 được biết Lcho 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 ...

Bạn không được mã hóa bất kỳ thông tin nào từ bảng này vào bài nộp của mình.

1 Bảng này có từ năm 1994, do đó có thể đã có nhiều tiến bộ hơn kể từ đó, nhưng tôi nghi ngờ rằng bất kỳ đệ trình nào cũng có thể xử lý ngay cả các mục lớn hơn trong bảng này trong một khoảng thời gian hợp lý.

Câu trả lời:


2

Con trăn 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]

Đầu vào chỉ đơn giản là trong định dạng 4, 3.

Tôi lặp đi lặp lại tạo ra tất cả các chuỗi, bắt đầu bằng 1và thỏa mãn hai thuộc tính, và lưu trữ chúng vào S. Vì tôi tạo chúng theo thứ tự được sắp xếp (được sắp xếp theo độ dài [và theo giá trị]), mục cuối cùng phải là một chuỗi Davenport-Schinzel. Sử dụng một thực tế tốt đẹp, rằng bạn có thể lặp lại một danh sách trong khi nối thêm nó.


Nếu bạn đã sử dụng python2, bạn có thể lưu một byte bằng cách kết hợp (cái mà tôi giả sử là hai khoảng trắng) vào một tab. Sửa lỗi cho tôi nếu tôi sai.
Zacharý
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.