Seperti yang Anda ketahui, python memiliki daftar. Karena Anda mungkin tidak tahu daftar ini dapat memuat diri mereka sendiri.
a = []
a.append(a)
Ini keren dan ada banyak hal menarik yang dapat Anda lakukan dengannya, namun Anda tidak dapat membandingkannya.
a = []
a.append(a)
b = []
b.append(b)
a == b
Tugas
Tugas Anda adalah menulis fungsi dengan Python (atau bahasa apa pun yang dapat menangani objek python secara langsung) yang akan mengambil dua daftar yang mungkin berisi dirinya sendiri dan membandingkannya.
Dua daftar sama jika panjangnya sama dan tidak ada urutan angka sehingga indeks kedua daftar dengan urutan itu menghasilkan dua objek yang tidak sama di bawah definisi yang sama ini. Semua objek non-daftar yang terkandung dalam daftar akan menjadi bilangan bulat python untuk kesederhanaan dan harus dibandingkan dengan persamaan builtin python untuk bilangan bulat.
Program Anda seharusnya tidak mengandalkan kedalaman rekursi dari python untuk menentukan apakah suatu daftar memiliki kedalaman tak terhingga. Itu adalah:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
Bukan cara yang valid untuk menentukan apakah dua daftar adalah referensial sendiri.
Testcases
Asumsikan Anda mendefinisikan suatu fungsi 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
sumber
Jawaban:
Python 2 , 94 byte
Cobalah online!
Peningkatan pada solusi cerdas isaacg untuk menyimpan
id
pasangan daftar yang sedang diproses dan menyatakannya sama jika perbandingan yang sama muncul pada level yang lebih rendah.Langkah rekursif
all(map(...,a,b))
mengatakan bahwaa
danb
sama jika semua pasangan elemen yang sesuai di dalamnya sama. Ini berfungsi dengan baik untuk menolak panjang yang tidak sama karenamap
berisi daftar terpendekNone
, tidak sepertizip
yang terpotong. Karena tidak ada daftar aktual yang berisiNone
, daftar empuk ini akan selalu ditolak.sumber
,
setelahc
?a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)
meluap tumpukan, dana=[1];b=[2];f(a,b);f(a,b)
terlihat seperti masalah usabilitas.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
. Mungkin ada cara yang lebih baik untuk menanganimap
.Python,
233218197217 byteFungsi anonim pada baris terakhir melakukan fungsi yang diinginkan.
Ini masih dalam proses menjadi golf, saya hanya ingin menunjukkan bahwa ini mungkin.
Intinya, kami memasukkan entri jika kami sedang mengerjakan cek yang diberikan. Dua hal sama jika mereka objek yang sama, jika mereka tidak daftar, dan mereka sama, atau jika semua elemen mereka sama atau sedang dikerjakan.
sumber
a>[]
bukani(a,list)
?a>[]<b
danlen(a)-len(b)
d(a)==d(b)
menjadia is b
? Itu akan memotong dua penggunaand
.