क्या ये सूचियाँ बराबर हैं?


19

जैसा कि आप बहुत अच्छी तरह से जानते हैं कि अजगर के पास सूचियां हैं। जैसा कि आप नहीं जानते होंगे कि ये सूचियां खुद को शामिल कर सकती हैं।

a = []
a.append(a)

अजगर २

अजगर ३

ये शांत हैं और बहुत सारी दिलचस्प चीजें हैं जो आप उनके साथ कर सकते हैं, हालांकि आप उनकी तुलना नहीं कर सकते।

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

अजगर २

अजगर ३

कार्य

आपका काम पायथन (या किसी भी भाषा जो सीधे अजगर की वस्तुओं को संभाल सकता है) में एक फ़ंक्शन लिखना है जो दो सूचियों को लेगा जो खुद को शामिल कर सकते हैं और उनकी तुलना कर सकते हैं।

दो सूचियाँ समान हैं यदि वे समान लंबाई की हैं और संख्याओं का अनुक्रम मौजूद नहीं है, तो उस क्रम के दोनों सूचियों को अनुक्रमित करने से दो ऑब्जेक्ट्स मिलते हैं जो समान की इस परिभाषा के तहत समान नहीं हैं। एक सूची में शामिल सभी गैर-सूची ऑब्जेक्ट्स सादगी के लिए अजगर पूर्णांक होंगे और पूर्णांक के लिए अजगर की अंतर्निहित समानता के साथ तुलना की जानी चाहिए।

आपके कार्यक्रम को यह निर्धारित करने के लिए अजगर की पुनरावृत्ति गहराई पर भरोसा नहीं करना चाहिए कि क्या कोई सूची असीम रूप से गहरी है। अर्थात्:

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

यह निर्धारित करने का एक वैध तरीका नहीं है कि क्या दो सूचियाँ स्वयं संदर्भित हैं।

परीक्षण के मामलों

मान लें कि आप एक फ़ंक्शन को परिभाषित करते हैं 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

@HeatWizard बिल्कुल पर्याप्त नहीं है - नेस्टेड सूचियों के साथ-साथ समान लंबाई भी होनी चाहिए।
xnor

आप वास्तव में उनकी तुलना कर सकते हैं। पायथन में, आप केवल "पुनरावृत्ति सीमित से अधिक" प्राप्त करते हैं यदि वे समान नहीं हैं। tio.run/nexus/…
mbomb007

@ mbomb007 थॉट्स क्योंकि डिफ़ॉल्ट रूप से अजगर संदर्भों की तुलना करता है। यदि आपके पास दो समान वस्तुएं हैं जिनके अलग-अलग संदर्भ हैं तो यह विफल हो जाता है, इसलिए चुनौती।
गेहूं जादूगर

2
क्या आप इस चुनौती को उन सभी भाषाओं में विस्तारित कर सकते हैं जहाँ सूचियाँ स्वयं शामिल हो सकती हैं?
कैलक्यूलेटरफ्लेन

जवाबों:


9

पायथन 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)

इसे ऑनलाइन आज़माएं!

इसाॅक के बहुत ही चतुर समाधानों में सुधार किया गया है ताकि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)पुन: प्रयोज्य समस्या की तरह दिखता है।
एंडर्स केसरग

@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

पायथन, 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 यह "सब कुछ सूचियों या किलों" नियम को जोड़ने से पहले लिखा गया था। अपडेट करूंगी।
19

आप उपयोग कर सकते हैं a>[]<bऔरlen(a)-len(b)
mbomb007

@ETHproductions ओह, उनकी बाइट गिनती गलत है। इसीलिए
mbomb007

हो सकता d(a)==d(b)है a is b? इससे दो उपयोग कट जाएंगे d
xnor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.