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)
if ix >= -1:
st, count = type(self).strlist[ix]
type(self).strlist[ix][1] += 1
self.__ix = ix
else:
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('----------------')
ZGVmIGZpbmRfaWYoZiwgY29sKToKICAgIHggPSBsaXN0KGZpbHRlcihmLCBjb2wpKQogICAgcmV0dXJuIGNvbC5pbmRleCh4WzBdKQoKY2xhc3MgU3ltYm9sKG9iamVjdCk6CiAgICBzdHJsaXN0ID0gW10KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICBpeCA9IGZpbmRfaWYobGFtYmRhIHg6IHhbMF0gPT0gc3RyKGRhdGEpLCB0eXBlKHNlbGYpLnN0cmxpc3QpCiAgICAgICAgaWYgaXggPj0gLTE6CiAgICAgICAgICAgIHN0LCBjb3VudCA9IHR5cGUoc2VsZikuc3RybGlzdFtpeF0KICAgICAgICAgICAgdHlwZShzZWxmKS5zdHJsaXN0W2l4XVsxXSArPSAxCiAgICAgICAgICAgIHNlbGYuX19peCA9IGl4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX2l4ID0gdHlwZShzZWxmKS5sZW4oc3RybGlzdCkKICAgICAgICAgICAgdHlwZShzZWxmKS5zdHJsaXN0LmFwcGVuZChbc3RyKGRhdGEpLCAxXSkKICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgIHN0LCBjb3VudCA9IHR5cGUoc2VsZikuc3RybGlzdFtzZWxmLl9faXhdCiAgICAgICAgdHlwZShzZWxmKS5zdHJsaXN0W3NlbGYuX19peF1bMV0gKz0gMQogICAgICAgIGlmIHR5cGUoc2VsZikuc3RybGlzdFtzZWxmLl9faXhdWzFdID09IDA6CiAgICAgICAgICAgIGRlbCB0eXBlKHNlbGYpLnN0cmxpc3Rbc2VsZi5fX2l4XQogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuc3RybGlzdFtzZWxmLl9faXhdWzBdCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJ7MH0gPHsxfT4iLmZvcm1hdChzdHIoc2VsZiksIGlkKHN0cihzZWxmKSkpCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpID09IHN0cihvdGhlcikKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikgIT0gc3RyKG90aGVyKQogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKSA8IHN0cihvdGhlcikKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikgPD0gc3RyKG90aGVyKQoKYSA9IFN5bWJvbCgnbG9sJykKYiA9IFN5bWJvbCgnd3V0JykKcHJpbnQoYSwgaWQoc3RyKGEpKSkKcHJpbnQoYiwgaWQoc3RyKGIpKSkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQp4ID0gU3ltYm9sKCdsb2wnKQp5ID0gU3ltYm9sKCd3dXQnKQpwcmludCh4LCBpZChzdHIoeCkpKQpwcmludCh5LCBpZChzdHIoeSkpKQpwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCg==