Wie Sie vielleicht wissen, hat Python Listen. Wie Sie vielleicht nicht wissen, können sich diese Listen selbst enthalten.
a = []
a.append(a)
Diese sind cool und es gibt viele interessante Dinge, die Sie damit machen können, die Sie jedoch nicht vergleichen können.
a = []
a.append(a)
b = []
b.append(b)
a == b
Aufgabe
Ihre Aufgabe ist es, eine Funktion in Python (oder einer beliebigen Sprache, die Python-Objekte direkt verarbeiten kann) zu schreiben, die zwei Listen aufnimmt, die sich möglicherweise selbst enthalten, und diese vergleicht.
Zwei Listen sind gleich, wenn sie gleich lang sind und es keine Folge von Zahlen gibt, so dass die Indizierung beider Listen nach dieser Folge zu zwei Objekten führt, die unter dieser Definition von gleich nicht gleich sind. Alle in einer Liste enthaltenen Nicht-Listenobjekte sind der Einfachheit halber Python-Ganzzahlen und sollten mit der in Python integrierten Gleichheit für Ganzzahlen verglichen werden.
Ihr Programm sollte sich nicht auf die Rekursionstiefe von Python verlassen, um festzustellen, ob eine Liste unendlich tief ist. Das ist:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
Ist keine gültige Methode, um festzustellen, ob zwei Listen selbstreferenziell sind.
Testfälle
Angenommen, Sie definieren eine Funktion 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
quelle
Antworten:
Python 2 , 94 Bytes
Probieren Sie es online!
Eine Verbesserung gegenüber der sehr cleveren Lösung von isaacg, die verarbeiteten Listenpaare zu speichern
id
und für gleich zu erklären, wenn derselbe Vergleich auf einer niedrigeren Ebene erfolgt.Der rekursive Schritt
all(map(...,a,b))
besagt, dassa
undb
gleich sind, wenn alle entsprechenden Elementpaare in ihnen gleich sind. Dies funktioniert gut, um ungleiche Längen abzulehnen, damap
die kürzeste Liste mit aufgefüllt wirdNone
, im Gegensatz zuzip
denen , die abgeschnitten werden. Da keine der tatsächlichen Listen enthältNone
, werden diese aufgefüllten Listen immer zurückgewiesen.quelle
,
nach demc
?a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)
Überläuft den Stapel unda=[1];b=[2];f(a,b);f(a,b)
scheint ein Wiederverwendbarkeitsproblem zu sein.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
. Vielleicht gibt es eine schönere Art, mit dem Problem umzugehenmap
.Python,
233218197217 BytesDie anonyme Funktion in der letzten Zeile führt die gewünschte Funktion aus.
Dies ist noch in der Entwicklung, ich wollte nur zeigen, dass dies möglich ist.
Im Wesentlichen setzen wir einen Eintrag in w, wenn wir an einem bestimmten Scheck arbeiten. Zwei Dinge sind gleich, wenn sie dasselbe Objekt sind, wenn sie keine Listen sind und wenn sie gleich sind oder wenn alle ihre Elemente gleich sind oder bearbeitet werden.
quelle
a>[]
statt verwendeni(a,list)
?a>[]<b
undlen(a)-len(b)
d(a)==d(b)
seina is b
? Das würde zwei Verwendungszwecke einschränkend
.