Comme vous le savez très bien, python a des listes. Comme vous ne le savez peut-être pas, ces listes peuvent se contenir.
a = []
a.append(a)
Ce sont cool et il y a beaucoup de choses intéressantes que vous pouvez faire avec eux, mais vous ne pouvez pas les comparer.
a = []
a.append(a)
b = []
b.append(b)
a == b
Tâche
Votre travail consiste à écrire une fonction en Python (ou tout autre langage capable de gérer directement des objets python) qui prendra deux listes qui peuvent se contenir et les comparer.
Deux listes sont égales si elles sont de la même longueur et qu'il n'existe pas de séquence de nombres telle que l'indexation des deux listes par cette séquence entraîne deux objets qui ne sont pas égaux selon cette définition d'égalité. Tous les objets non list contenus dans une liste seront des entiers python pour plus de simplicité et devraient être comparés avec l'égalité intégrée de python pour les entiers.
Votre programme ne doit pas s'appuyer sur la profondeur de récursivité de python pour déterminer si une liste est infiniment profonde. C'est:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
N'est pas un moyen valable de déterminer si deux listes sont auto-référentielles.
Cas de test
Suppose que vous définissez une fonction 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
la source
Réponses:
Python 2 , 94 octets
Essayez-le en ligne!
Une amélioration par rapport à la solution très intelligente d'isaacg qui consiste à stocker les
id
paires de listes en cours de traitement et à les déclarer égales si la même comparaison apparaît à un niveau inférieur.L'étape récursive
all(map(...,a,b))
dit quea
etb
sont égaux si toutes les paires d'éléments correspondantes en eux sont égales. Cela fonctionne bien pour rejeter les longueurs inégales carmap
remplit la liste la plus courteNone
, contrairement àzip
ce qui tronque. Puisqu'aucune des listes réelles ne contientNone
, ces listes remplies seront toujours rejetées.la source
,
aprèsc
?a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)
déborde de la pile eta=[1];b=[2];f(a,b);f(a,b)
ressemble à un problème de réutilisabilité.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
. Il y a peut-être une meilleure façon de gérer lemap
.Python,
233218197217 octetsLa fonction anonyme sur la dernière ligne exécute la fonction souhaitée.
C'est encore en cours de golf, je voulais juste montrer que c'est possible.
Essentiellement, nous mettons une entrée dans w si nous travaillons sur un chèque donné. Deux choses sont égales si elles sont le même objet, si elles ne sont pas des listes et elles sont égales, ou si tous leurs éléments sont égaux ou en cours d'élaboration.
la source
a>[]
place dei(a,list)
?a>[]<b
etlen(a)-len(b)
d(a)==d(b)
êtrea is b
? Cela réduirait deux utilisations ded
.