From c701791c19e54be8860605e135cbbb387340df5c Mon Sep 17 00:00:00 2001
From: "iliya.saroukha" <iliya.saroukhanian@etu.hesge.ch>
Date: Thu, 10 Apr 2025 18:13:41 +0200
Subject: [PATCH] feat: computing fixed code

---
 dyn_huffman.py | 33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/dyn_huffman.py b/dyn_huffman.py
index eb04d1e..0e26050 100644
--- a/dyn_huffman.py
+++ b/dyn_huffman.py
@@ -4,6 +4,10 @@ import numpy as np
 import pprint
 import math
 import argparse
+import string
+
+LIST_ALPHABET = list(string.ascii_lowercase) + list(string.digits)
+DICT_ALPHABET = {item: index + 1 for index, item in enumerate(LIST_ALPHABET)}
 
 @dataclass
 class Node:
@@ -46,28 +50,41 @@ def insert_char(tree: Node, char: str):
     swap(tree)
 
 
-def compute_vitter_params(m: int) -> (int, int):
+def compute_vitter_params(m: int) -> tuple[int, int]:
     e = math.floor(np.log2(m))
     r = m - (2 ** e)
-
     return (e, r)
 
 
-def main(string: str) -> None:
-    print(compute_vitter_params(26))
+def compute_k(char: str) -> int:
+    return DICT_ALPHABET[char]
+
+
+def compute_code(char: str):
+    e, r = compute_vitter_params(len(LIST_ALPHABET))
+    k_char = compute_k(char)
+
+    if k_char <= 2*r:
+        bin_val = k_char - 1
+        n_bits = e + 1
+        return bin(bin_val)[2:].zfill(n_bits)
+    else:
+        bin_val = k_char - r - 1
+        return bin(bin_val)[2:].zfill(e)
 
+
+def main(string: str) -> None:
     tree = Node()
+    enc = []
 
     for c in string:
         pprint.pp(tree)
         print(f'\n====== Inserting \'{c}\' ======\n')
         insert_char(tree, c)
+        enc.append(compute_code(c))
 
     pprint.pp(tree)
-
-    # pprint.pp(tree)
-
-
+    pprint.pp(enc)
 
 
 if __name__ == "__main__":
-- 
GitLab