From 945acae53ce295cc7d282067e1488dbc05bc5fb3 Mon Sep 17 00:00:00 2001 From: gkozhemiakin Date: Mon, 3 Apr 2023 20:31:23 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B7=D0=B0=D1=80=D1=85=D0=B8=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20.lzw?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson_2/Lession_2.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lesson_2/Lession_2.py diff --git a/lesson_2/Lession_2.py b/lesson_2/Lession_2.py new file mode 100644 index 0000000..398a78a --- /dev/null +++ b/lesson_2/Lession_2.py @@ -0,0 +1,41 @@ +import math +import sys + +if not (2 <= len(sys.argv) <= 3): + print('Usage: python', sys.argv[0], 'input_file (output_file)') + exit(-1) + +with open(sys.argv[1], 'rb') as file: + data = file.read() + +outpath = sys.argv[2] if len(sys.argv) == 3 else sys.argv[1] + '.txt' + +dictionary = {i: (i, ) for i in range(256)} +sequence = list() +i = 0 + +with open(outpath, 'wb') as file: + while i < len(data): + if len(sequence) == 0: + n = len(dictionary) + else: + n = len(dictionary) + 1 + + nbits = math.ceil(math.log2(n)) + if n % 8 != 0: + nbytes = nbits // 8 + 1 + else: + nbytes = nbits // 8 + + Slice = data[i:i+nbytes] + sym = int.from_bytes(Slice, 'little') + + if sym == len(dictionary): + new_sequence = sequence + sequence[-1] + else: + new_sequence = dictionary[sym] + + file.write(new_sequence) + dictionary[len(dictionary)] = sequence + new_sequence[-1] + i += nbytes + sequence = new_sequence \ No newline at end of file From 120f36f2c8a560a739f6174e14aa8640eec74c5e Mon Sep 17 00:00:00 2001 From: gkozhemiakin Date: Mon, 3 Apr 2023 21:27:34 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson_2/Lession_2.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/lesson_2/Lession_2.py b/lesson_2/Lession_2.py index 398a78a..0c57817 100644 --- a/lesson_2/Lession_2.py +++ b/lesson_2/Lession_2.py @@ -2,15 +2,14 @@ import sys if not (2 <= len(sys.argv) <= 3): - print('Usage: python', sys.argv[0], 'input_file (output_file)') + print('Usage: python', sys.argv[0], 'input_file') exit(-1) -with open(sys.argv[1], 'rb') as file: +with open(sys.argv[1],'rb') as file: data = file.read() outpath = sys.argv[2] if len(sys.argv) == 3 else sys.argv[1] + '.txt' - -dictionary = {i: (i, ) for i in range(256)} +dictionary = {i: (i,) for i in range(256)} sequence = list() i = 0 @@ -20,22 +19,18 @@ n = len(dictionary) else: n = len(dictionary) + 1 - nbits = math.ceil(math.log2(n)) - if n % 8 != 0: - nbytes = nbits // 8 + 1 - else: + if nbits % 8 == 0: nbytes = nbits // 8 - - Slice = data[i:i+nbytes] - sym = int.from_bytes(Slice, 'little') - - if sym == len(dictionary): - new_sequence = sequence + sequence[-1] else: - new_sequence = dictionary[sym] - - file.write(new_sequence) - dictionary[len(dictionary)] = sequence + new_sequence[-1] + nbytes = nbits // 8 + 1 + Slice = data[i:i + nbytes] + index = int.from_bytes(Slice, 'little') + if index == len(dictionary): + new_sequence = sequence + sequence[-1:] + else: + new_sequence = list(dictionary[index]) + file.write(bytearray(new_sequence)) + dictionary[len(dictionary)] = tuple(sequence + new_sequence[-1:]) i += nbytes - sequence = new_sequence \ No newline at end of file + sequence = new_sequence