Como bien sabrás, Python tiene listas. Como puede que no sepa, estas listas pueden contenerse.
a = []
a.append(a)
Estos son geniales y hay muchas cosas interesantes que puedes hacer con ellos, sin embargo, no puedes compararlos.
a = []
a.append(a)
b = []
b.append(b)
a == b
Tarea
Su trabajo es escribir una función en Python (o cualquier lenguaje que pueda manejar objetos de Python directamente) que tomará dos listas que pueden contener y compararlas.
Dos listas son iguales si tienen la misma longitud y no existe una secuencia de números, de modo que indexar ambas listas por esa secuencia da como resultado dos objetos que no son iguales bajo esta definición de igual. Todos los objetos que no están en la lista contenidos en una lista serán enteros de python por simplicidad y deben compararse con la igualdad incorporada de python para enteros.
Su programa no debe confiar en la profundidad de recursión de Python para determinar si una lista es infinitamente profunda. Es decir:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
No es una forma válida de determinar si dos listas son autorreferenciales.
Casos de prueba
Asume que define una función 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
fuente
Respuestas:
Python 2 , 94 bytes
Pruébalo en línea!
Una mejora en la solución muy inteligente de isaacg de almacenar los
id
pares de listas que se procesan y declararlas iguales si la misma comparación aparece en un nivel inferior.El paso recursivo
all(map(...,a,b))
dice esoa
yb
son iguales si todos los pares de elementos correspondientes en ellos son iguales. Esto funciona muy bien para rechazar la longitud desigual porquemap
rellena la lista más cortaNone
, a diferencia de lazip
que se trunca. Como ninguna de las listas reales contieneNone
, estas listas rellenadas siempre serán rechazadas.fuente
,
después de lac
?a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)
desborda la pila ya=[1];b=[2];f(a,b);f(a,b)
parece un problema de reutilización.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
. Tal vez hay una mejor manera de manejar elmap
.Python,
233218197217 bytesLa función anónima en la última línea realiza la función deseada.
Esto todavía está en proceso de golf, solo quería mostrar que esto es posible.
Esencialmente, ponemos una entrada en w si estamos trabajando en un cheque dado. Dos cosas son iguales si son el mismo objeto, si no son listas y son iguales, o si todos sus elementos son iguales o están siendo trabajados.
fuente
a>[]
lugar dei(a,list)
?a>[]<b
ylen(a)-len(b)
d(a)==d(b)
sera is b
? Eso reduciría dos usos ded
.