Skip to content

Instantly share code, notes, and snippets.

@woodrush
Created January 22, 2024 01:38
Show Gist options
  • Save woodrush/97b58c926291fcb78b90e2ef2b4f02ef to your computer and use it in GitHub Desktop.
Save woodrush/97b58c926291fcb78b90e2ef2b4f02ef to your computer and use it in GitHub Desktop.
Visualizing the Levenshtein coding
codes_leven = [
"0",
"10",
"1100",
"1101",
"1110000",
"1110001",
"1110010",
"1110011",
"11101000",
"11101001",
"11101010",
"11101011",
"11101100",
"11101101",
"11101110",
"11101111",
"111100000000",
"111100000001",
]
codes_leven = [[int(x) for x in code] for code in codes_leven]
values_leven = range(18)
class Leven(object):
depth = 0
def __init__(self,l):
self.l = l
def getbit(self):
self.print_d(self.depth, "getbit")
bit = self.l[0]
self.l = self.l[1:]
return bit
def leven(self):
self.depth += 1
l_orig = list(self.l)
bits_read = []
self.print_d(self.depth - 1, f"leven called: [")
bit = self.getbit()
bits_read.append(bit)
if bit == 0:
self.print_d(self.depth, f"leven for {bits_read} is 0. (base case)")
self.print_d(self.depth-1, "]")
self.depth -= 1
return 0, bits_read
length, inner_bits_read = self.leven()
bits_read_prefix = list(bits_read)
self.print_d(self.depth, f"Prefix: {bits_read}, length: {length} (from {inner_bits_read}). Will read {length} (== length) more bits")
bits_read = []
x = 1
for _ in range(length):
bit = self.getbit()
bits_read.append(bit)
x = 2*x + bit
self.print_d(self.depth, f"leven for {bits_read_prefix} ++ {inner_bits_read} ++ {bits_read} is {x}.")
self.print_d(self.depth-1, "]")
self.depth -= 1
return x, bits_read_prefix + inner_bits_read + bits_read
def print_d(self, d, s):
print(" "*d + s)
for code, v in zip(codes_leven, values_leven):
x = Leven(code).leven()[0]
assert x == v
print("\nLeven", code, "==", x)
print("\n========\n")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment