import random
def pair(x,y):
z = 0
i = 0
while x > 0 or y > 0:
z |= (x & 1)<<i
i += 1
z |= (y & 1)<<i
i += 1
x >>= 1
y >>= 1
return z
def unpair(z):
x = 0
y = 0
i = 0
while z > 0:
x |= (z & 1) << i
y |= (z & 2) >> 1 << i
i += 1
z >>= 2
return (x,y)
def pair_many(seq):
z = pair(seq[0], seq[1])
for item in seq[2:]:
z = pair(z, item)
return z
def unpair_many(z, size):
result = []
for _ in range(size-1):
z, item = unpair(z)
result.append(item)
result.append(z)
result.reverse()
return result
seq = [4, 8, 15, 16, 23, 42]
z = pair_many(seq)
print(z)
print(unpair_many(z, len(seq)))
aW1wb3J0IHJhbmRvbQoKZGVmIHBhaXIoeCx5KToKICAgIHogPSAwCiAgICBpID0gMAogICAgd2hpbGUgeCA+IDAgb3IgeSA+IDA6CiAgICAgICAgeiB8PSAoeCAmIDEpPDxpCiAgICAgICAgaSArPSAxCiAgICAgICAgeiB8PSAoeSAmIDEpPDxpCiAgICAgICAgaSArPSAxCiAgICAgICAgeCA+Pj0gMQogICAgICAgIHkgPj49IDEKICAgIHJldHVybiB6CgpkZWYgdW5wYWlyKHopOgogICAgeCA9IDAKICAgIHkgPSAwCiAgICBpID0gMAogICAgd2hpbGUgeiA+IDA6CiAgICAgICAgeCB8PSAoeiAmIDEpIDw8IGkKICAgICAgICB5IHw9ICh6ICYgMikgPj4gMSA8PCBpCiAgICAgICAgaSArPSAxCiAgICAgICAgeiA+Pj0gMgogICAgcmV0dXJuICh4LHkpCgpkZWYgcGFpcl9tYW55KHNlcSk6CiAgICB6ID0gcGFpcihzZXFbMF0sIHNlcVsxXSkKICAgIGZvciBpdGVtIGluIHNlcVsyOl06CiAgICAgICAgeiA9IHBhaXIoeiwgaXRlbSkKICAgIHJldHVybiB6CgpkZWYgdW5wYWlyX21hbnkoeiwgc2l6ZSk6CiAgICByZXN1bHQgPSBbXQogICAgZm9yIF8gaW4gcmFuZ2Uoc2l6ZS0xKToKICAgICAgICB6LCBpdGVtID0gdW5wYWlyKHopCiAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmVzdWx0LmFwcGVuZCh6KQogICAgcmVzdWx0LnJldmVyc2UoKQogICAgcmV0dXJuIHJlc3VsdAoKc2VxID0gWzQsIDgsIDE1LCAxNiwgMjMsIDQyXQp6ID0gcGFpcl9tYW55KHNlcSkKcHJpbnQoeikKcHJpbnQodW5wYWlyX21hbnkoeiwgbGVuKHNlcSkpKQ==