19
As you may very well know python has lists. As you might not know these lists can contain themselves.
a = []
a.append(a)
These are cool and there are lots of interesting things you can do with them, however you cannot compare them.
a = []
a.append(a)
b = []
b.append(b)
a == b
Task
Your job is to write a function in Python (or any language that can handle python objects directly) that will take two lists that may contain themselves and compare them.
Two lists are equal if they are the same length and there does not exist sequence of numbers such that indexing both of the lists by that sequence results in two objects that are not equal under this definition of equal. All non-list objects contained in a list will be python integers for simplicity and should be compared with python's builtin equality for integers.
Your program should not rely on the recursion depth of python to determine if a list is infinitely deep. That is:
def isInfinite(a,b):
try:
a==b
return False
except RunTimeError:
return True
Is not a valid way of determining if two lists are self referential.
Testcases
Assumes you define a function 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
As a side note to potential voters: Note that generally language specific challenges are frowned upon except for in certain circumstances (like tasks that are only interesting in certain languages). IMO, this is a wonderful example of a language-specific challenge.
– James – 2017-04-20T18:25:13.753@WheatWizard That's not exactly enough -- the nested lists need to also be the same lengths as well. – xnor – 2017-04-20T19:09:51.957
@WheatWizard You actually can compare them. In Python, you only get a "recursion limited exceeded" if they aren't equal. https://tio.run/nexus/python2#@5@oYKsQHcuVqJdYUJCal6KRqMmVBBFKQhIqKMrMK1FItLVN@v8fAA
– mbomb007 – 2017-04-20T19:10:10.697@mbomb007 Thats because python by default compares the references. If you have two identical objects that have different references it fails, hence the challenge. – Post Rock Garf Hunter – 2017-04-20T19:12:58.297
Additional test case:
a = [] b = [] c = [] a.append(b) b.append(c) c.append(a) f(a, b)
. Tests loops of size > 1. – isaacg – 2017-04-20T19:49:41.310I don't know if it is OK to golf this in another language, because the code will be obviously longer than python solution... – Keyu Gan – 2017-07-12T03:40:46.137
Should the submissions be reusable? E.g. should it be possible to call the function many times and always get the correct answer? – isaacg – 2017-07-12T20:31:55.950
@isaacg Yes they should. – Post Rock Garf Hunter – 2017-07-12T20:35:11.277
2Can you extend this challenge to all languages where lists can contain themselves? – CalculatorFeline – 2017-07-12T21:38:41.557
Is it okay to destroy the input lists? Or should they remain unmutated? – Akshat Mahajan – 2017-07-12T23:38:04.210
@AkshatMahajan They should remain unmuted. – Post Rock Garf Hunter – 2017-07-12T23:38:52.607
@KeyuGan, Python code can be shorter in non-Python languages!
– Not a tree – 2017-07-13T01:26:39.533Technically, in
a = [];a.append(a);b = [a]
, they're not equal. The infinity ofa
would be one less than the infinity ofb
. If you can assume they're not equal, then I believerepr(a)==repr(b)
would work (tested in 3.6.1). – zgrep – 2017-07-13T04:24:00.010@zgrep Since the infinity we are concerned with is cardinal not ordinal they are the same size. – Post Rock Garf Hunter – 2017-07-13T04:24:51.170
@WheatWizard Ah, I see. Okay. – zgrep – 2017-07-13T04:25:17.710