การเรียงลำดับของสองรายการหลักที่ไม่เรียงกัน


13

คำนิยาม

เวกเตอร์มีnองค์ประกอบมีการกล่าวถึง majorizeหรือ ครองเวกเตอร์กับn องค์ประกอบ IFF ทุกค่าkดังกล่าวที่ 1 ≤ knผลรวมขององค์ประกอบแรกของผ่านkองค์ประกอบของ TH เป็นมากขึ้น กว่าหรือเท่ากับผลรวมของคนแรกที่ผ่านk TH องค์ประกอบของ ที่วีหมายถึงเวกเตอร์วีเรียงจากมากไปน้อย

นั่นคือ,

                          a_1 >= b_1
                    a_1 + a_2 >= b_1 + b_2
              a_1 + a_2 + a_3 >= b_1 + b_2 + b_3
                              ...
      a_1 + a_2 + ... + a_n-1 >= b_1 + b_2 + ... + b_n-1
a_1 + a_2 + ... + a_n-1 + a_n >= b_1 + b_2 + ... + b_n-1 + b_n

โดยที่aและbเรียงลำดับจากมากไปน้อย

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

ท้าทาย

ได้รับการป้อนข้อมูลของทั้งสองรายการที่แตกต่างกันและของจำนวนเต็มในช่วง 0 ผ่าน 255 (รวม) ทั้งสองรายการของความยาวn ≥ 1 เอาท์พุทไม่ว่าจะเป็นรายการแรกไม่ได้เรียงลำดับ-majorizes ที่สอง ( > ) ที่สอง unsorted- เอกสาขาแรก ( b > a ) หรือไม่

คุณอาจต้องเลือกความยาวของทั้งสองรายการที่จะให้เป็นอินพุต การส่งออกจะต้องเป็นหนึ่งในสามของค่าที่แตกต่างกัน แต่ค่าที่ตัวเองอาจจะเป็นสิ่งที่คุณต้องการ (โปรดระบุค่าแทน > B , B > และไม่อยู่ในคำตอบของคุณ)

กรณีทดสอบสำหรับa > b :

[255] [254]
[3,2,1] [3,1,2]
[6,1,5,2,7] [2,5,4,3,7]

กรณีทดสอบสำหรับb > a :

[9,1] [10,0]
[6,5,4] [7,6,5]
[0,1,1,2,1,2] [0,1,2,1,2,1]

กรณีทดสอบสำหรับการไม่มีวิชาเอก:

[200,100] [150,250]
[3,1,4] [2,3,3]
[9,9,9,9,9,0] [8,8,8,8,8,9]

เราสามารถใช้อาร์เรย์ 2 คอลัมน์เป็นอินพุตได้หรือไม่?
Luis Mendo

1
@LuisMendo ใช่อินพุตอาจอยู่ในรูปแบบใด ๆ ที่ไม่ได้เข้ารหัสข้อมูลเพิ่มเติม
Doorknob

ชุดของคู่จะยอมรับได้หรือไม่
Dennis

คำตอบ:


6

เจลลี่ , 10 8 6 ไบต์

2 ไบต์ด้วย @orlp

2 ไบต์ขอบคุณ @Dennis

_+\ṠQS

ลองออนไลน์!

1สำหรับa>b, -1สำหรับa<b, 0ไม่มี majorization

_+\ṠQS

_       Difference (vectorized)
 +\     Cumulative sum.
   Ṡ    Sign of every difference
    Q   Deduplicate
     S  Sum

ถ้ามีทั้ง1และ-1ปัจจุบัน (บางส่วนจำนวนเงินที่สะสมมีขนาดใหญ่บางเล็กกว่า) 0แล้วขั้นตอนสุดท้ายที่จะผลิต


3

ngn / apl, 11 ไบต์

{+/∪×+\⍺-⍵}

ตามวิธีการใน @Leaky นูนของคำตอบ

ได้รับสองรายการและB , ค้นหาความแตกต่างระหว่างแต่ละ elementwise ค่าหรือให้C = a - b จากนั้นหาผลรวมสะสมของCและนำสัญญาณของแต่ละ ผลรวมของค่าเครื่องหมายที่ไม่ซ้ำกันจะเป็นผลลัพธ์ ถ้าA > Bผลลัพธ์คือ 1 ถ้าA < Bผลลัพธ์เป็น -1 และถ้าไม่มีส่วนใหญ่ผลลัพธ์จะเป็น 0

ลองออนไลน์


3

Julia 30 ไบต์

a^b=sum(sign(cumsum(a-b))∪0)

บันทึกแล้ว 4 ไบต์ขอบคุณ @Dennis!


จูเลียรุ่นไหนที่คุณทดสอบสิ่งนี้?
Dennis

โอ๊ะโอ: PI คิดว่าควรใช้งานได้
Mama Fun Roll

1
จริง a^b=sum(sign(cumsum(a-b))∪0)บันทึกไม่กี่ไบต์
เดนนิส

2

Python 3.5, 85 ไบต์:

lambda*e:[all(sum(g[:k])>=sum(h[:k])for k in range(1,-~len(h)))for g,h in[e,e[::-1]]]

ฟังก์ชั่นแลมบ์ดานิรนาม ส่งคืน[True,False]ถ้าa>b, [False,True]ถ้าb>a, หรือ[False,False]ว่าไม่มีค่าใดเป็นจริง ฉันหวังว่ามันจะโอเค

ลองออนไลน์! (Ideone)


2

Cheddar , 118 114 bytes

n->[n.map(i->i[0]-i[1]).map((j,k,l)->l.slice(0,k+1).sum).map(i->i>0?1:i<0?-1:0)].map(j->j has 1?j has-1?0:1:-1)[0]

โดยทั่วไปพอร์ตของคำตอบของฉัน Jelly

ความจริงที่ว่าฟังก์ชั่นภายในขอบเขตเสียก่อให้เกิดความไม่สามารถที่จะกำหนดตัวแปรหมายถึงฟังก์ชั่นภายในที่ผมจะต้องทำแทน[xxx].map(i->yyy)[0]var a=xxx;yyy

รับอาร์เรย์ transposed เป็นอินพุต

n->[n
.map(i->i[0]-i[1])                     Difference (vectorized)
.map((j,k,l)->l.slice(0,k+1).sum)      Cumulative sum.
.map(i->i>0?1:i<0?-1:0)]               Sign of every difference
.map(j->j has 1?j has-1?0:1:-1)[0]     Deduplicate and Sum



1

Python 2, 59 ไบต์

t=r=0
for x,y in zip(*input()):t+=x-y;r|=cmp(t,0)%3
print r

ขาออก:

  • 1 สำหรับ a>b
  • 2 สำหรับ b>a
  • 3 สำหรับไม่

วนซ้ำตามรายการติดตามผลรวมtของความแตกต่าง จำนวนจะsติดตามสิ่งที่สัญญาณถูกมองว่าเป็นตัวเลขสองบิตr: บวกในบิตที่ถูกต้องและเชิงลบในบิตซ้าย สิ่งนี้เกิดขึ้นผ่านทางcmp(t,0)%3ซึ่งให้

  • t>0 →→ +11
  • t==0→→ 0 0
  • t<0 →→ -12

การรับสิ่งorนี้และค่าปัจจุบันของrการอัพเดต 2 บิตด้วยorโดยที่ค่าศูนย์จะไม่มีผลกระทบ


0

Javascript (ใช้ไลบรารีภายนอก - นับได้) (123 ไบต์)

(a,b)=>(z=(c,d)=>_.Range(1,c.length).All(x=>_.From(c).Take(x).Sum()>=_.From(d).Take(x).Sum()))(a,b)==z(b,a)?0:(z(a,b)?1:-1)

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable

คำอธิบายรหัส: ส่งผ่านเวกเตอร์ a และ b, สร้างฟังก์ชันส่วนกลาง z z จะเริ่มต้นด้วยการสร้างอาร์เรย์ของจำนวนเต็มตั้งแต่ 1 เพื่อนับ a.length . ทั้งหมดจะยืนยันว่าเพรดิเคตนั้นเป็นจริงสำหรับสมาชิกทุกคนที่เป็นของ เพรดิเคตนั้นบอกว่าให้โหลด a แบบนับได้ใช้นับจำนวนที่เทียบเท่ากับค่าการวนซ้ำปัจจุบันของช่วงนั้นที่เราทำและผลรวมนั้น ตรวจสอบว่า> = ตรรกะเดียวกันจากอาร์เรย์ "b" ดังนั้นเราจึงเรียก z ตามลำดับ (a, b) และเปรียบเทียบกับคำสั่งของ (b, a) ... ถ้าเท่ากับเรากลับ 0 เพื่อแสดงว่าไม่มีหลัก มิฉะนั้นเราจะคืนค่า 1 หาก (a, b) เป็นจริงหรือไม่ใช่ -1

ป้อนคำอธิบายรูปภาพที่นี่

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