import struct
b26chars = "eocapgvqrynhmlsubixdftwzjk"
_ekeys = (69, 75, 89, 91)
_dkeys = (141, 99, 233, 211)
def _encrypt(n):
packed = struct.pack(">L", n)
encrypted = ''.join(chr((_ekeys[i] * ord(c)) % 256) for i, c in enumerate(packed))
return struct.unpack(">L", encrypted)[0]
def _decrypt(n):
packed = struct.pack(">L", n)
decrypted = ''.join(chr((_dkeys[i] * ord(c)) % 256) for i, c in enumerate(packed))
return struct.unpack(">L", decrypted)[0]
def b26(k):
n = _encrypt(k)
res = []
while n > 0:
n, m = divmod(n, 26)
res.append(b26chars[m])
if not res:
return b26chars[0]
res.reverse()
return ''.join(res)
def unb26(s):
n = 0
for i, c in enumerate(s[::-1].lower()):
n += b26chars.index(c)*26**i
try:
return _decrypt(n)
except:
return 0
def find(s, predicate, count = 1):
n = unb26(s)
i = 0
while True:
i = i + 1
if (i & 65535) == 0:
print 'i =', i
id = b26(n + i)
if predicate(id):
print id, n + i, i
count = count - 1
if count == 0:
break
def gets(s, count = 10):
find(s, lambda x: (x[2] == x[3] and (x[3] == x[4] or x[1] == x[2])) or (x[0] == x[1] and x[1] == x[2]), count)
gets('igqsk', 30)
find('igqsk', lambda x: x.find('girl') != -1)
aW1wb3J0IHN0cnVjdAoKYjI2Y2hhcnMgPSAiZW9jYXBndnFyeW5obWxzdWJpeGRmdHd6amsiCgpfZWtleXMgPSAoNjksIDc1LCA4OSwgOTEpCl9ka2V5cyA9ICgxNDEsIDk5LCAyMzMsIDIxMSkKCmRlZiBfZW5jcnlwdChuKToKICAgIHBhY2tlZCA9IHN0cnVjdC5wYWNrKCI+TCIsIG4pCiAgICBlbmNyeXB0ZWQgPSAnJy5qb2luKGNocigoX2VrZXlzW2ldICogb3JkKGMpKSAlIDI1NikgZm9yIGksIGMgaW4gZW51bWVyYXRlKHBhY2tlZCkpCiAgICByZXR1cm4gc3RydWN0LnVucGFjaygiPkwiLCBlbmNyeXB0ZWQpWzBdCgpkZWYgX2RlY3J5cHQobik6CiAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjaygiPkwiLCBuKQogICAgZGVjcnlwdGVkID0gJycuam9pbihjaHIoKF9ka2V5c1tpXSAqIG9yZChjKSkgJSAyNTYpIGZvciBpLCBjIGluIGVudW1lcmF0ZShwYWNrZWQpKQogICAgcmV0dXJuIHN0cnVjdC51bnBhY2soIj5MIiwgZGVjcnlwdGVkKVswXQoKZGVmIGIyNihrKToKICAgIG4gPSBfZW5jcnlwdChrKQogICAgcmVzID0gW10KICAgIHdoaWxlIG4gPiAwOgogICAgICAgIG4sIG0gPSBkaXZtb2QobiwgMjYpCiAgICAgICAgcmVzLmFwcGVuZChiMjZjaGFyc1ttXSkKICAgIGlmIG5vdCByZXM6CiAgICAgICAgcmV0dXJuIGIyNmNoYXJzWzBdCiAgICByZXMucmV2ZXJzZSgpCiAgICByZXR1cm4gJycuam9pbihyZXMpCgpkZWYgdW5iMjYocyk6CiAgICBuID0gMAogICAgZm9yIGksIGMgaW4gZW51bWVyYXRlKHNbOjotMV0ubG93ZXIoKSk6CiAgICAgICAgbiArPSBiMjZjaGFycy5pbmRleChjKSoyNioqaQogICAgdHJ5OgogICAgICAgIHJldHVybiBfZGVjcnlwdChuKQogICAgZXhjZXB0OgogICAgICAgIHJldHVybiAwCgpkZWYgZmluZChzLCBwcmVkaWNhdGUsIGNvdW50ID0gMSk6CiAgbiA9IHVuYjI2KHMpCiAgaSA9IDAKICB3aGlsZSBUcnVlOgogICAgaSA9IGkgKyAxCiAgICBpZiAoaSAmIDY1NTM1KSA9PSAwOgogICAgICBwcmludCAnaSA9JywgaQogICAgaWQgPSBiMjYobiArIGkpCiAgICBpZiBwcmVkaWNhdGUoaWQpOgogICAgICBwcmludCBpZCwgbiArIGksIGkKICAgICAgY291bnQgPSBjb3VudCAtIDEKICAgICAgaWYgY291bnQgPT0gMDoKICAgICAgICBicmVhawoKZGVmIGdldHMocywgY291bnQgPSAxMCk6CiAgZmluZChzLCBsYW1iZGEgeDogKHhbMl0gPT0geFszXSBhbmQgKHhbM10gPT0geFs0XSBvciB4WzFdID09IHhbMl0pKSBvciAoeFswXSA9PSB4WzFdIGFuZCB4WzFdID09IHhbMl0pLCBjb3VudCkKCmdldHMoJ2lncXNrJywgMzApCgpmaW5kKCdpZ3FzaycsIGxhbWJkYSB4OiB4LmZpbmQoJ2dpcmwnKSAhPSAtMSk=