การเปรียบเทียบรายการพจนานุกรม


9

อินพุต

สองรายการAและBจำนวนเต็มที่ไม่ติดลบ

เอาท์พุต

อย่างใดอย่าง1หนึ่ง0หรือ-1ขึ้นอยู่กับว่าAมีขนาดใหญ่กว่าเท่ากับหรือเล็กกว่าที่Bเกี่ยวกับการจัดเรียงคำศัพท์บิดตามที่กำหนดไว้ด้านล่าง ถ้าคุณต้องการคุณสามารถแทนที่1, 0และ-1อื่น ๆ สามค่าคงที่ใด ๆ

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

i < i+1 < i+2 < i+3 < ... < [missing element] < i-1 < i-2 < i-3 < ... < 2 < 1 < 0

โปรดทราบว่าครั้งแรก...หมายถึงตัวเลขมากมาย ซึ่งหมายความว่ารายการต่อไปนี้อยู่ในลำดับจากน้อยไปมากตามการเรียงลำดับพจนานุกรมบิด:

[3,2,3,4]
[3,2,3,5]
[3,2,3,10]
[3,2,3,1341]
[3,2,3]
[3,2,3,3]
[3,2,3,2]
[3,2,3,1]
[3,2,3,0]

กฎระเบียบ

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

กรณีทดสอบ

Output 1:
[0] []
[] [1]
[] [1,2,1,2]
[2,1] [1,1]
[0,1,2] [0,2,1]
[3,0] [3,1]
[3,1] [3]
[2] [2,2]
[2] [2,23]
[2,24] [2,23]
[2,1] [2,23]

Output 0:
[] []
[0] [0]
[1,1] [1,1]
[2,1,2] [2,1,2]

Output -1:
[1,2,1,1,2] [1,2,1,1,1]
[1,2,1,1,5] [1,2,1,1,4]
[1,2,1,1,5] [1,2,1,1]
[1,2,1] [1,2,1,1]
[1,2,1,1,5] [1,2,1,1,6]
[1,2,1,1,6] [1,2,1,1,7]

รายการอินพุตมีการทำดัชนีจาก 0, จาก 1 หรือจากสิ่งที่เหมาะสมกับภาษาของเราหรือไม่?
Peter Taylor

@PeterTaylor ตั้งแต่วันที่ 1 ฉันจะชี้แจงว่า
Zgarb

ฉันสามารถใช้ Enum ของ Haskell เพื่อเปรียบเทียบผลลัพธ์แทน -1/0/1 สำหรับผลลัพธ์ได้หรือไม่
John Dvorak

@JanDvorak ฉันจะอนุญาตและแก้ไขการท้าทาย
Zgarb

คำตอบ:


1

CJam - 57

q:S~=0{S~]:A:,~e>{A{_,I>{I=_I>0{W*2}?}1?[\]}%}fI]z~>2*(}?

ใช่มันยังคงยาวมาก ...

ลองออนไลน์

คำอธิบายโดยย่อ:
รหัสผลลัพธ์ 0 ถ้าอาร์เรย์เท่ากันในความหมายดั้งเดิมมิฉะนั้นจะแปลงแต่ละรายการของแต่ละอาร์เรย์ให้เป็นอาร์เรย์ 2 องค์ประกอบ: [0 a i ] ถ้าi > i (อิง 0), [1 อะไรก็ตามถ้าฉันหายไปและ [2 -a ฉัน ] ถ้าฉัน <= i ในกระบวนการอาร์เรย์ที่สั้นกว่าจะถูกขยายให้มีขนาดใหญ่ขึ้นเช่นกัน จากนั้นอาร์เรย์ที่ถูกแปลงจะถูกเปรียบเทียบ lexicographically และผลลัพธ์จะถูกปรับเป็น -1/1


3

Python 2, 76 ไบต์

c=lambda*a:cmp(*[[(max(i-x,-1),x)for i,x in enumerate(L)]+[(0,)]for L in a])

สิ่งนี้จะแทนที่แต่ละจำนวนเต็มในทั้งสองรายการด้วย 2-tuple เพื่อบัญชีสำหรับการสั่งซื้อแบบบิด built-in ของ Python 2 cmpทำส่วนที่เหลือ

การใช้งาน:

>>> c([1,2,1,1,6], [1,2,1,1,7])
-1

1
บัญชีนี้จะทำให้รายการสั้นลงได้อย่างไรในรายการที่ยาวขึ้น ( [3,2,3,1341] < [3,2,3] < [3,2,3,0]?
nutki

@ nutki เพิ่ม tuple (0,)ต่อท้ายรายการแต่ละรายการซึ่งมากกว่า(-1, x)และน้อยกว่า(i-x, x)เมื่อi-x >= 0ใด
grc

โอ้แน่นอน ฉันไม่อ่านออกเขียนด้วยภาษาไพ ธ อน
nutki

1

Perl, 74

ไม่มีฟังก์ชั่นการจัดการอาเรย์ที่ดี Perl ไม่ใช่เครื่องมือที่ดีที่สุดสำหรับงาน แต่มันใช้งานได้

#!perl -pa
$i=0,s/\d+,?/$s=sprintf"%9d",$&;$&>$i++?$s:~$s/ge for@F;$_=$F[0]cmp$F[1]

ทดสอบฉัน


1

J, 95 ไบต์

(ไม่สั้นมาก แต่เป็นอะไรก็ตามสามารถเล่นได้อย่างแน่นอน)

f=.4 :0
m=.>:>./x,y
t=.(|+(1+m)*0>:*)@(i.@#-~])@(],m$~>&#*-&#)
x(t~(*@-&((m+#x,y)&#.))t)y
)

ผ่านทุกกรณีทดสอบ (ชุดกรณีทดสอบที่ยอดเยี่ยม! ขอบคุณ!)

วิธี:

  • Padding รายการที่สั้นกว่าด้วย maxvalue + 1 ( m=.>:>./x,y)(],m$~>&#*-&#
  • การแปลงองค์ประกอบรายการเพื่อให้การเปรียบเทียบปกติสามารถใช้ได้ (|+(1+m)*0>:*)@(i.@#-~])
  • การคำนวณตัวเลข baseX สองรายการจากสองรายการด้วย X ที่เพียงพอ ((m+#x,y)&#.)
  • การส่งกลับ Signum ของตัวเลขสองตัวที่ต่างกัน*@-&

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