def find_if(f, col):
x = 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), strlist)
if ix >= -1:
st, count = strlist[ix]
strlist[ix][1] += 1
self.__ix = ix
else:
self.__ix = len(strlist)
strlist.append([str(data), 1])
def __del__(self):
st, count = strlist[self.__ix]
strlist[self.__ix][1] += 1
if strlist[self.__ix][1] == 0:
del strlist[self.__ix]
def __str__(self):
return 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(a, id(str(a)))
print(b, id(str(b)))
print('----------------')
ZGVmIGZpbmRfaWYoZiwgY29sKToKICAgIHggPSBmaWx0ZXIoZiwgY29sKQogICAgcmV0dXJuIGNvbC5pbmRleCh4WzBdKQoKY2xhc3MgU3ltYm9sKG9iamVjdCk6CiAgICBzdHJsaXN0ID0ge30KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICBpeCA9IGZpbmRfaWYobGFtYmRhIHg6IHhbMF0gPT0gc3RyKGRhdGEpLCBzdHJsaXN0KQogICAgICAgIGlmIGl4ID49IC0xOgogICAgICAgICAgICBzdCwgY291bnQgPSBzdHJsaXN0W2l4XQogICAgICAgICAgICBzdHJsaXN0W2l4XVsxXSArPSAxCiAgICAgICAgICAgIHNlbGYuX19peCA9IGl4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX2l4ID0gbGVuKHN0cmxpc3QpCiAgICAgICAgICAgIHN0cmxpc3QuYXBwZW5kKFtzdHIoZGF0YSksIDFdKQogICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgc3QsIGNvdW50ID0gc3RybGlzdFtzZWxmLl9faXhdCiAgICAgICAgc3RybGlzdFtzZWxmLl9faXhdWzFdICs9IDEKICAgICAgICBpZiBzdHJsaXN0W3NlbGYuX19peF1bMV0gPT0gMDoKICAgICAgICAgICAgZGVsIHN0cmxpc3Rbc2VsZi5fX2l4XQogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cmxpc3Rbc2VsZi5fX2l4XVswXQogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9IDx7MX0+Ii5mb3JtYXQoc3RyKHNlbGYpLCBpZChzdHIoc2VsZikpKQogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKSA9PSBzdHIob3RoZXIpCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpICE9IHN0cihvdGhlcikKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikgPCBzdHIob3RoZXIpCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpIDw9IHN0cihvdGhlcikKCmEgPSBzeW1ib2woJ2xvbCcpCmIgPSBzeW1ib2woJ3d1dCcpCnByaW50KGEsIGlkKHN0cihhKSkpCnByaW50KGIsIGlkKHN0cihiKSkpCnByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKeCA9IHN5bWJvbCgnbG9sJykKeSA9IHN5bWJvbCgnd3V0JykKcHJpbnQoYSwgaWQoc3RyKGEpKSkKcHJpbnQoYiwgaWQoc3RyKGIpKSkKcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQo=