Bu listeler eşit mi?


19

Çok iyi bildiğiniz gibi python listeleri vardır. Bilmediğiniz gibi bu listeler kendilerini içerebilir.

a = []
a.append(a)

Python 2

Python 3

Bunlar harika ve onlarla yapabileceğiniz birçok ilginç şey var, ancak bunları karşılaştıramazsınız.

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

Python 2

Python 3

Görev

İşiniz, Python'da (veya doğrudan python nesnelerini işleyebilen herhangi bir dilde) kendilerini içerebilecek iki liste alacak ve bunları karşılaştıracak bir işlev yazmaktır.

İki liste aynı uzunluktaysa eşittir ve her iki listenin de bu diziye endekslenmesi, bu eşit tanımı altında eşit olmayan iki nesne ile sonuçlanacak şekilde bir sayı dizisi yoktur. Bir listede yer alan tüm liste dışı nesneler, basitlik için python tamsayılarıdır ve python'un tamsayılar için yerleşik eşitliği ile karşılaştırılmalıdır.

Programınız olmamalıdır bir liste sonsuz derin olup olmadığını belirlemek için pitonun tekrarlama derinliğiyle güveniyor. Yani:

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

İki listenin kendi kendine referans olup olmadığını belirlemenin geçerli bir yolu değildir.

testcases

Bir işlev tanımladığınızı varsayar 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
Potansiyel seçmenler için bir yan not olarak: Belirli durumlar dışında (sadece belirli dillerde ilginç olan görevler gibi) genellikle dile özgü zorlukların göz ardı edildiğine dikkat edin . IMO, bu dile özgü bir meydan okuma için harika bir örnek.
DJMcMayhem

@WheatWizard Bu tam olarak yeterli değil - iç içe listelerin de aynı uzunluklarda olması gerekir.
xnor

@WheatWizard Aslında onları karşılaştırabilirsiniz. Python'da, yalnızca eşit değilse "özyineleme sınırlı aşıldı" elde edersiniz. tio.run/nexus/…
mbomb007

@ mbomb007 Thats çünkü python varsayılan olarak referansları karşılaştırır. Farklı referanslara sahip iki özdeş nesneniz varsa başarısız olur.
Buğday Büyücüsü

2
Bu zorluğu listelerin kendilerini içerebileceği tüm dillere genişletebilir misiniz?
CalculatorFeline

Yanıtlar:


9

Python 2 , 94 bayt

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)

Çevrimiçi deneyin!

İlgili bir gelişme isaacg en çok akıllı çözeltisi saklama idlisteleri çiftleri işlenir ve aynı karşılaştırma daha düşük bir seviyede kadar gelirse bunları eşit ilan edilir.

Özyinelemeli adım all(map(...,a,b)), içinde karşılık gelen tüm eleman çifti eşit olduğunda ave beşit olduğunu söyler . Bu, eşit olmayan uzunluğu reddetmek için iyi çalışır , çünkü hangi kısaltmanın aksine map, en kısa listeyi doldurur . Gerçek listelerin hiçbiri içermediğinden , bu dolgulu listeler her zaman reddedilir.NonezipNone


Amacı nedir ,sonra c?
Buğday Büyücüsü

Bir demet yapar.
mbomb007

a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)yığını taşar ve a=[1];b=[2];f(a,b);f(a,b)yeniden kullanılabilirlik sorunu gibi görünür.
Anders Kaseorg

@AndersKaseorg Görüyorum, listeyi değiştirerek sorun istiyordu. Bence bu düzeltildi.
xnor

1
@AndersKaseorg Ve görüyorum ki temelde aynı işlev-içinde-işlev çözümü yazdınız. Bu olmadan 95 bayt çözüm vardır: 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. Belki üstesinden gelmek için daha güzel bir yol var map.
xnor

5

Python, 233 218 197 217 bayt

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,{})

Son satırdaki anonim işlev, istenen işlevi gerçekleştirir.

Bu hala golf oynama sürecinde, sadece bunun mümkün olduğunu göstermek istedim.

Esasen, belirli bir çek üzerinde çalışıyorsak w girişini yaptık. Aynı nesne, liste değilse ve eşitse veya tüm öğeleri eşitse veya üzerinde çalışılıyorsa iki şey eşittir.


a>[]Bunun yerine kullanamaz i(a,list)mısın?
mbomb007

@ mbomb007 Bu, "Her şey listeler veya girişler" kuralı eklenmeden önce yazılmıştır. Güncellenecek.
isaacg

Kullanabilirsiniz a>[]<bvelen(a)-len(b)
mbomb007

@ETHproductions Oh, bayt sayısı yanlış. Bu yüzden
mbomb007

Can d(a)==d(b)olmak a is b? Bunun iki kullanımı kesilir d.
xnor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.