base = 26 BASE = [0] index = 0 table = [""] hash_table = {}
definit(): for i in range(6): BASE.append(BASE[len(BASE)-1]+base**i)
defget_N(x): for i in range(len(BASE)): if BASE[i] <= x and BASE[i+1] > x: return i
defcantor(x): # short to index result = 0 for i in range(len(x)): result += (ord(x[i])-ord('a')) * base**(len(x) - i - 1) return result + BASE[len(x)]
defre_cantor(x): # index to short n = get_N(x) x -= BASE[n] result = "" for i in range(n): tmp = x // (base ** (n-i-1)) result = result + chr(ord('a') + tmp) x -= tmp * (base ** (n-i-1)) return result
init()
defurl_shortener(long_url): global index if long_url notin hash_table: index = index + 1 table.append(long_url) short_url = re_cantor(index) hash_table[long_url] = short_url else: print(long_url) short_url = hash_table[long_url] return'short.ly/'+short_url