รายการเหล่านี้เท่ากันหรือไม่


19

อย่างที่คุณทราบกันดีว่าหลามมีรายการอยู่ ในขณะที่คุณอาจไม่ทราบว่ารายการเหล่านี้สามารถมีตัวเอง

a = []
a.append(a)

Python 2

Python 3

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

a = []
a.append(a)
b = []
b.append(b)
a == b

Python 2

Python 3

งาน

งานของคุณคือการเขียนฟังก์ชั่นใน Python (หรือภาษาใด ๆ ที่สามารถจัดการกับวัตถุหลามโดยตรง) ที่จะมีสองรายการที่อาจมีตัวเองและเปรียบเทียบพวกเขา

สองรายการมีค่าเท่ากันหากมีความยาวเท่ากันและไม่มีลำดับของตัวเลขเช่นนั้นซึ่งการทำดัชนีทั้งสองรายการตามลำดับนั้นจะส่งผลให้วัตถุสองรายการที่ไม่เท่ากันภายใต้คำจำกัดความที่เท่ากันนี้ วัตถุที่ไม่ใช่รายการทั้งหมดที่มีอยู่ในรายการจะเป็นจำนวนเต็มหลามเพื่อความง่ายและควรนำมาเปรียบเทียบกับความเสมอภาคของ python สำหรับจำนวนเต็ม

โปรแกรมของคุณไม่ควรใช้ความลึกในการเรียกซ้ำของไพ ธ อนเพื่อตรวจสอบว่ารายการนั้นมีความลึกไม่สิ้นสุด นั่นคือ:

def isInfinite(a,b):
 try:
  a==b
  return False
 except RunTimeError:
  return True

ไม่ใช่วิธีที่ถูกต้องในการพิจารณาว่ารายการสองรายการเป็นการอ้างอิงตนเองหรือไม่

Testcases

สมมติว่าคุณกำหนดฟังก์ชั่น equal

a = []
a.append(a)
b = []
b.append(b)
print(equal(a,b))

True

a = []
b = []
a.append(b)
b.append(a)
print(equal(a,b))

True

a = []
b = []
a.append(1)
a.append(b)
b.append(1)
b.append(a)
print(equal(a,b))

True

a = []
a.append(a)
b = [a]
print(equal(a,b))

True

a = []
b = []
c = []
a.append(b)
b.append(c)
c.append(a)
equal(a,b)

True

a=[1,[2]]
b=[1,[2,[1]]]
a[1].append(a)
b[1][1].append(b[1])

True

a = []
a.append(a)
b = [1]
b.append(a)
c = [1]
c.append([c])
print(equal(b,c))

False

a = []
b = []
a.append(1)
a.append(b)
b.append(a)
b.append(1)
print(equal(a,b))

False

a = []
b = []
a.append(a)
b.append(b)
b.append(b)
print f(a,b)

False

17
ในฐานะที่เป็นหมายเหตุข้างถึงผู้มีสิทธิเลือกตั้งที่มีศักยภาพ: โปรดทราบว่าโดยทั่วไปความท้าทายที่เฉพาะเจาะจงภาษาจะขมวดคิ้วเมื่อ ยกเว้นในบางสถานการณ์ (เช่นงานที่น่าสนใจเฉพาะในบางภาษา) IMO นี่เป็นตัวอย่างที่ยอดเยี่ยมของความท้าทายเฉพาะภาษา
DJMcMayhem

@WheatWizard นั้นยังไม่เพียงพอ - รายการซ้อนต้องมีความยาวเท่ากันเช่นกัน
xnor

@WheatWizard คุณสามารถเปรียบเทียบได้จริง ใน Python คุณจะได้รับ "การเรียกซ้ำ จำกัด เกิน" เท่านั้นหากไม่เท่ากัน tio.run/nexus/…
mbomb007

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

2
คุณสามารถขยายความท้าทายนี้ไปยังทุกภาษาที่รายการสามารถมีตนเองได้หรือไม่?
CalculatorFeline

คำตอบ:


9

Python 2 , 94 ไบต์

g=lambda c,*p:lambda a,b:c in p or all(map(g((id(a),id(b)),c,*p),a,b))if a>[]<b else a==b
g(0)

ลองออนไลน์!

การปรับปรุงโซลูชันที่ชาญฉลาดมากของ isaacg ในการจัดเก็บidคู่ของรายการที่กำลังประมวลผลและประกาศพวกเขาเท่ากันหากการเปรียบเทียบเดียวกันเกิดขึ้นในระดับที่ต่ำกว่า

ขั้นตอนแบบเรียกซ้ำจะall(map(...,a,b))บอกว่าaและbมีค่าเท่ากันหากองค์ประกอบที่เกี่ยวข้องทั้งหมดในคู่นั้นเท่ากัน วิธีนี้ใช้ได้ผลดีในการปฏิเสธความยาวไม่เท่ากันเพราะใช้mapแผ่นที่สั้นที่สุดซึ่งNoneแตกต่างจากzipที่ตัดให้สั้น เนื่องจากไม่มีรายการที่เกิดขึ้นจริงมีNoneรายการเบาะเหล่านี้จะถูกปฏิเสธเสมอ


วัตถุประสงค์ของการ,หลังจากที่cคืออะไร?
ข้าวสาลีตัวช่วยสร้าง

มันทำให้สิ่งอันดับ
mbomb007

a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)ล้นสแต็กและa=[1];b=[2];f(a,b);f(a,b)ดูเหมือนว่าปัญหาการนำมาใช้ซ้ำ
Anders Kaseorg

@AndersKaseorg ฉันเห็นแล้วว่าการกลายพันธุ์รายการนั้นเป็นการขอปัญหา ฉันคิดว่านี่จะแก้ไขได้
xnor

1
@AndersKaseorg และฉันเห็นว่าคุณเขียนพื้นฟังก์ชั่นฟังก์ชั่นในฟังก์ชั่นเดียวกัน มีวิธีการแก้ปัญหา 95 f=lambda a,b,p=[0]:p[0]in p[1:]or all(map(f,a,b,[[(id(a),id(b))]+p]*len(a)))if a>[]<b else a==bไบต์โดยไม่ต้องว่า: mapอาจจะมีวิธีที่ดีกว่าที่จะจัดการกับ
xnor

5

Python, 233 218 197 217 ไบต์

d=id
def q(a,b,w):
 w[(d(a),d(b))]=0
 if d(a)==d(b):return 1
 if(a>[]and[]<b)-1:return a==b
 if len(a)!=len(b):return 0
 for x,y in zip(a,b):
  if((d(x),d(y))in w or q(x,y,w))-1:return 0
 return 1
lambda a,b:q(a,b,{})

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

นี่ยังอยู่ในขั้นตอนของการเล่นกอล์ฟฉันแค่อยากจะแสดงให้เห็นว่ามันเป็นไปได้

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


คุณไม่สามารถใช้a>[]แทนi(a,list)?
mbomb007

@ mbomb007 สิ่งนี้ถูกเขียนก่อนเพิ่มกฎ "Everything is list หรือ ints" จะอัปเดต
isaacg

คุณสามารถใช้a>[]<bและlen(a)-len(b)
mbomb007

@ETHproductions โอ้จำนวนไบต์ของเขาผิด นั่นเป็นเหตุผล
mbomb007

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