ข้ามลำดับ


11

ข้ามลำดับ

รับรายการของจำนวนเต็มบวกAเรียกมันว่าลำดับที่เพิ่มขึ้นถ้าแต่ละองค์ประกอบมากกว่าหรือเท่ากับหนึ่งก่อนหน้า; และเรียกว่าเป็นลำดับที่ลดลงหากแต่ละองค์ประกอบน้อยกว่าหรือเท่ากับหนึ่งก่อนหน้า

ลำดับที่เพิ่มขึ้นบางส่วน:

[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]

บางลำดับลดลง:

[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]

ลำดับข้ามคือรายการที่สามารถย่อยสลายเป็นสอง subsequences เคล็ดหนึ่งลำดับที่เพิ่มขึ้นและอื่น ๆ ตามลำดับการลด

ตัวอย่างเช่นรายการ:

[3,5,2,4,1]

เป็นลำดับการข้ามเนื่องจากสามารถแบ่งย่อยเป็น:

[3,    4  ]
[  5,2,  1]

ที่[3,4]เป็นลำดับที่เพิ่มขึ้นและ[5,2,1]เป็นลำดับที่ลดลง เราจะเรียกคู่ดังกล่าว (ที่เพิ่มขึ้นลดลง) subsequences การสลายตัวของลำดับการผสมข้ามพันธุ์

รายการ:

[4,5,2,1,3]

ไม่ใช่ลำดับการข้าม ไม่มีวิธีที่จะย่อยสลายมันเป็นลำดับที่เพิ่มขึ้นและลดลง

งานของคุณคือการเขียนโปรแกรม / ฟังก์ชั่นการใช้เป็นรายการของจำนวนเต็มบวก; และถ้าเป็นลำดับข้ามให้ส่งคืนสองรายการในหนึ่งในการย่อยสลาย หรือค่า "เท็จ" ที่สอดคล้องกันหากรายการไม่ใช่ลำดับการข้าม

นี่คือ ; โปรแกรม / ฟังก์ชั่นที่สั้นที่สุดในแต่ละภาษาเป็นผู้ชนะ

กฎ:

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

กรณีทดสอบ:

ใช้Falseเพื่อระบุลำดับที่ไม่ข้าม:

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
ซ้ำที่เป็นไปได้ มีเพียงความแตกต่างสองประการที่ฉันเห็นคือความท้าทายอื่น ๆ ควรดำเนินการในเวลาพหุนามตามความยาวของอินพุตและอนุญาตให้ใช้ค่าจริงแทนที่จะเป็นสององค์ประกอบ (การคืนค่าองค์ประกอบนั้นจะได้รับโบนัส 20%) ยังคงฟังดูเหมือนล่อให้ฉัน แต่ฉันจะไม่ตอกมัน
Kevin Cruijssen

@KevinCruijssen การ จำกัด เวลาน่าจะเพียงพอสำหรับตัวเองที่จะไม่ทำให้มันเป็นคนหลอกลวง
Nick Kennedy

1
@NickKennedy อาจเป็นไปได้ใช่ซึ่งเป็นเหตุผลที่ฉันละเว้นจากการตอกมัน :)
Kevin Cruijssen

2
[3, 5, 2, 4, 4, 1, 1]กรณีทดสอบที่แนะนำ: กรณีทดสอบในปัจจุบันช่วยให้คุณได้รับไปด้วย>=/ <เมื่อมันจริงๆควรจะ/>= <=
Grimmy

1
@Arnauld: ใช่มันสามารถเป็นค่าใด ๆ ("falsey" เป็นเพียงการพูด: มันเป็นเท็จว่าการป้อนข้อมูลเป็นลำดับข้าม)
Chas Brown

คำตอบ:


1

05AB1E , 15 14 13 ไบต์

2.Œ.ΔćRšεü@}W

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

2.Œ                    # all partitions of the input in 2 subsequences
   .Δ                  # find the first partition such that the following gives 1
     ćRš               # reverse the first subsequence
        ε  }           # map each subsequence to
         ü@            # pairwise greater-than
            W          # minimum (1 if all 1s, 0 otherwise)


1

JavaScript (ES6),  110 105  104 ไบต์

[[decreasing], [increasing]]1

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

ลองออนไลน์!

อย่างไร?

n02LL

[0][1]ผมn

1ผม=1-1ผม=0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

some()


1

Haskell, 84 ไบต์

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

ส่งคืนรายการของ(decreasing,increasing)คู่ที่ถูกต้องทั้งหมดหรือรายการที่ว่างเปล่าหากไม่มีคู่ดังกล่าว

ลองออนไลน์!


1

Python 3 , 109 107 ไบต์

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

ลองออนไลน์!

ฟังก์ชั่นพิมพ์การย่อยสลายที่เป็นไปได้ทั้งหมดไปยังเอาต์พุตมาตรฐาน หากไม่มีการย่อยสลายที่เป็นไปได้จะไม่มีการพิมพ์ออกมา

ขอบคุณ @Sriotchilism O'Zaic สำหรับคำแนะนำในการปรับปรุง


ยินดีต้อนรับสู่เว็บไซต์ ฉันขอแนะนำให้ทำs<i[-1]มากกว่าi[-1]>s และคล้ายกับd[-1]<s ทั้งสองบันทึกไบต์
Ad Hoc Garf Hunter

ขอบคุณสำหรับคำแนะนำ ฉันได้อัพเดตคำตอบแล้ว มีเทมเพลตคัดลอกวางที่นี่เพื่อเผยแพร่คำตอบ?
Joel

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร? TIO มีแม่แบบที่คุณใช้อยู่แล้ว
Ad Hoc Garf Hunter

ฉันสร้างลิงค์ใน TIO และเพิ่มลิงค์ไปยังโพสต์ของฉัน ฉันไม่ได้ใช้เทมเพลตใด ๆ มันอยู่ที่ไหน?
โจเอล

1
@Joel - ที่ด้านบนของหน้า TIO มีไอคอนที่ดูเหมือนลิงค์โซ่ คลิกที่นั้นแล้วคุณจะได้หน้าตัวเลือก หนึ่งในนั้นคือ 'การส่งรหัสกอล์ฟ' ที่จะใส่ลงในบัฟเฟอร์การคัดลอกของคุณสิ่งที่จัดรูปแบบที่คุณต้องการ! ยินดีต้อนรับคุณและเป็นทางออกที่ดี!
Chas Brown

0

Brachylogขนาด 17 ไบต์

;Ṣzpᵐz{ℕˢ}ᵐ≤₁ʰ≥₁ᵗ

ลองออนไลน์!

อาจมีห้องจำนวนมากในการเล่นกอล์ฟนี้


2
คุณได้ตอบคำถามนี้ก่อนหน้านี้แล้วซึ่งคุณทำมาแล้ว 16 ไบต์ ;)
Kevin Cruijssen

ฉันไม่สามารถสั่นคลอนความรู้สึกว่ามีบางสิ่งที่คล้ายกันฉันได้ทำไป แต่ด้วยเหตุผลบางอย่างที่ใจของฉันตัดสินใจว่ามันต้องเป็นสิ่งนี้แทน
สตริงที่ไม่เกี่ยวข้อง

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