def find_if(f, col):
x = list(filter(f, col))
return col.index(x[0])
class Symbol(object):
strlist = []
def __init__(self, data):
ix = find_if(lambda x: x[0] == str(data), type(self).strlist)
try:
st, count = type(self).strlist[ix]
type(self).strlist[ix][1] += 1
self.__ix = ix
except IndexError:
self.__ix = type(self).len(strlist)
type(self).strlist.append([str(data), 1])
def __del__(self):
st, count = type(self).strlist[self.__ix]
type(self).strlist[self.__ix][1] += 1
if type(self).strlist[self.__ix][1] == 0:
del type(self).strlist[self.__ix]
def __str__(self):
return type(self).strlist[self.__ix][0]
def __repr__(self):
return "{0} <{1}>".format(str(self), id(str(self)))
def __eq__(self, other):
return str(self) == str(other)
def __ne__(self, other):
return str(self) != str(other)
def __lt__(self, other):
return str(self) < str(other)
def __le__(self, other):
return str(self) <= str(other)
a = Symbol('lol')
b = Symbol('wut')
print(a, id(str(a)))
print(b, id(str(b)))
print('----------------')
x = Symbol('lol')
y = Symbol('wut')
print(x, id(str(x)))
print(y, id(str(y)))
print('----------------')
ZGVmIGZpbmRfaWYoZiwgY29sKToKICAgIHggPSBsaXN0KGZpbHRlcihmLCBjb2wpKQogICAgcmV0dXJuIGNvbC5pbmRleCh4WzBdKQoKY2xhc3MgU3ltYm9sKG9iamVjdCk6CiAgICBzdHJsaXN0ID0gW10KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICBpeCA9IGZpbmRfaWYobGFtYmRhIHg6IHhbMF0gPT0gc3RyKGRhdGEpLCB0eXBlKHNlbGYpLnN0cmxpc3QpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdCwgY291bnQgPSB0eXBlKHNlbGYpLnN0cmxpc3RbaXhdCiAgICAgICAgICAgIHR5cGUoc2VsZikuc3RybGlzdFtpeF1bMV0gKz0gMQogICAgICAgICAgICBzZWxmLl9faXggPSBpeAogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICBzZWxmLl9faXggPSB0eXBlKHNlbGYpLmxlbihzdHJsaXN0KQogICAgICAgICAgICB0eXBlKHNlbGYpLnN0cmxpc3QuYXBwZW5kKFtzdHIoZGF0YSksIDFdKQogICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgc3QsIGNvdW50ID0gdHlwZShzZWxmKS5zdHJsaXN0W3NlbGYuX19peF0KICAgICAgICB0eXBlKHNlbGYpLnN0cmxpc3Rbc2VsZi5fX2l4XVsxXSArPSAxCiAgICAgICAgaWYgdHlwZShzZWxmKS5zdHJsaXN0W3NlbGYuX19peF1bMV0gPT0gMDoKICAgICAgICAgICAgZGVsIHR5cGUoc2VsZikuc3RybGlzdFtzZWxmLl9faXhdCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5zdHJsaXN0W3NlbGYuX19peF1bMF0KICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfSA8ezF9PiIuZm9ybWF0KHN0cihzZWxmKSwgaWQoc3RyKHNlbGYpKSkKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikgPT0gc3RyKG90aGVyKQogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKSAhPSBzdHIob3RoZXIpCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpIDwgc3RyKG90aGVyKQogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKSA8PSBzdHIob3RoZXIpCgphID0gU3ltYm9sKCdsb2wnKQpiID0gU3ltYm9sKCd3dXQnKQpwcmludChhLCBpZChzdHIoYSkpKQpwcmludChiLCBpZChzdHIoYikpKQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCnggPSBTeW1ib2woJ2xvbCcpCnkgPSBTeW1ib2woJ3d1dCcpCnByaW50KHgsIGlkKHN0cih4KSkpCnByaW50KHksIGlkKHN0cih5KSkpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tJykK