สร้างลำดับดาเวนพอร์ท - Schinzel


11

พื้นหลัง

ลำดับ Davenport-Schinzelมีสองตัวแปรจำนวนเต็มบวกและd nเราจะแสดงว่าชุดของทุกลำดับ Davenport-Schinzel DS(d,n)สำหรับพารามิเตอร์ที่กำหนดโดย

พิจารณาลำดับทั้งหมดของตัวเลขธรรมชาติ1เพื่อnรวมซึ่งตอบสนอง:

  • ไม่มีตัวเลขสองตัวติดต่อกันในลำดับที่เหมือนกัน
  • ไม่มีความยาวที่มากกว่ากัน (ไม่จำเป็นต้องต่อเนื่องกัน) dซึ่งสลับไปมาระหว่างตัวเลขสองจำนวนที่แตกต่างกัน

อนุญาตLแสดงความยาวสูงสุดของลำดับดังกล่าว (ที่กำหนดdและn) จากนั้นเป็นชุดของลำดับดังกล่าวทั้งหมดที่มีความยาวDS(d,n)L

ตัวอย่างบางส่วนอาจช่วยได้ อนุญาตd = 4, n = 3. ลำดับที่ยาวที่สุดที่เป็นไปได้ที่มีข้อ จำกัด L = 8เหล่านี้มี ดังนั้นต่อไปนี้เป็นสมาชิกของDS(4,3):

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

ไม่มีตัวเลขที่เหมือนกันติดต่อกันและมีการเรียงลำดับความยาวสลับกัน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.

สำหรับข้อมูลเพิ่มเติมดูMathWorldและOEISและการอ้างอิงที่พวกเขาแสดงรายการ

ความท้าทาย

ได้รับสองจำนวนเต็มบวกnและdสร้างใด ๆ ลำดับ Davenport-Schinzel DS(d,n)ใน โปรดทราบว่าโดยทั่วไปจะไม่ซ้ำกันดังนั้นให้แสดงผลลัพธ์ที่ถูกต้องเพียงรายการเดียว

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นรับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันและส่งคืนผลลัพธ์จากฟังก์ชันหรือพิมพ์ไปยัง STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด)

คุณสามารถใช้สตริงหรือรูปแบบรายการที่สะดวกไม่คลุมเครือสำหรับเอาท์พุท

นี่คือรหัสกอล์ฟดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) ชนะ

ลำดับความยาว

เนื่องจากซีเควนซ์นั้นไม่เหมือนกันจึงไม่มีการใช้ตัวอย่างบุคคลในการท้าทายนี้มากนัก อย่างไรก็ตามปัญหาความถูกต้องทั่วไปทั้งสองนั้นค่อนข้างง่ายต่อการตรวจสอบเอาต์พุตดังนั้นคำถามหลักคือว่าลำดับมีความยาวที่ถูกต้อง (หรือมีลำดับที่ถูกต้องอีกต่อไป) ดังนั้นนี่คือรายการของ1 ที่ รู้จักLสำหรับการได้รับdและn:

 \ 
 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การป้อนข้อมูลเป็นเพียงในรูปแบบ

ฉันสร้างวนซ้ำทั้งหมดซึ่งเริ่มต้นด้วย1คุณสมบัติของทั้งสองและเก็บไว้ในSนั้น เนื่องจากฉันสร้างพวกเขาตามลำดับ (เรียงตามความยาว [และตามค่า]) รายการสุดท้ายจึงต้องเป็นลำดับดาเวนพอร์ต - ชินชิเซล ใช้ความจริงที่ดีที่คุณสามารถทำซ้ำในรายการในขณะที่ผนวกเข้ากับมัน


หากคุณใช้ python2 อยู่แล้วคุณสามารถบันทึกไบต์ด้วยการรวม (สิ่งที่ฉันคิดว่าเป็นสองช่องว่าง) ลงในแท็บ ช่วยแก้ให้ด้วยนะถ้าฉันผิด.
Zacharý
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.