From befc1fe436fd0019c3d73168541c8b447b89cc53 Mon Sep 17 00:00:00 2001 From: shmetakov Date: Thu, 23 Apr 2020 18:51:19 +0300 Subject: [PATCH] Lesson 9 --- Lesson_9/task_1.py | 30 ++++++++++++++++++ Lesson_9/task_2.py | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 Lesson_9/task_1.py create mode 100644 Lesson_9/task_2.py diff --git a/Lesson_9/task_1.py b/Lesson_9/task_1.py new file mode 100644 index 0000000..e720838 --- /dev/null +++ b/Lesson_9/task_1.py @@ -0,0 +1,30 @@ +# 1. Определение количество различных подстрок с использованием хеш-функции. +# Пусть на вход функции дана строка. Требуется вернуть количество различных подстрок в этой строке. + +# Примечания: +# * в сумму не включаем пустую строку и строку целиком; +# * задача считается решённой, если в коде использована функция +# вычисления хеша (hash(), sha1() или любая другая из модуля hashlib) + +import hashlib + + +def substring_count(s: str) -> int: + assert len(s) > 0, 'Строка не может быть пустой' + + set_hash = set() + s_hash = hashlib.sha1(s.encode('utf-8')).hexdigest() + + for i in range(len(s) - 1): + for j in range(i + 1, len(s) + 1): + spam = hashlib.sha1(s[i:j].encode('utf-8')).hexdigest() + if spam != s_hash: + set_hash.add(spam) + + return len(set_hash) + + +s = input('Введите строку: ') +num = substring_count(s) + +print(f'Количество подстрок {num}') diff --git a/Lesson_9/task_2.py b/Lesson_9/task_2.py new file mode 100644 index 0000000..a846280 --- /dev/null +++ b/Lesson_9/task_2.py @@ -0,0 +1,78 @@ +# 2. Закодируйте любую строку по алгоритму Хаффмана. + +from collections import defaultdict, OrderedDict + + +class MyNode: + + def __init__(self, data, priority, left=None, right=None): + self.data = data + self.priority = priority + self.left = left + self.right = right + self.char_code = defaultdict(str) + + def __str__(self): + return f"'{self.data}': {self.priority}" + + def __getattr__(self, name): + if name == 'priority': + return self.priority + + def get_dict_bin_code(self, code=''): + + if self.data: + self.char_code[self.data] = code + return self.char_code + + if self.left: + self.char_code.update(self.left.get_dict_bin_code(code + '0')) + + if self.right: + self.char_code.update(self.right.get_dict_bin_code(code + '1')) + + return self.char_code + + +def Haffman(s): + char_freq = defaultdict(int) + + for char in s: + char_freq[char] += 1 + + queue = list() + + for k, v in char_freq.items(): + queue.append(MyNode(k, v)) + + print('Частота всех символов: ') + for item in queue: + print(item) + print('*' * 50) + + while len(queue) != 1: + queue = sorted(queue, key=lambda my_node: my_node.priority, reverse=True) + + el_1 = queue.pop() + el_2 = queue.pop() + + queue.append(MyNode(None, el_1.priority + el_2.priority, el_1, el_2)) + + bin_tree = queue.pop() + char_code = bin_tree.get_dict_bin_code() + + print('Коды для символов: ') + for k, v in char_code.items(): + print(f'{k}: {v}') + print('*' * 50) + + spam_str = '' + + for char in s: + spam_str = spam_str + char_code[char] + + return spam_str + + +print(f'Закодированная строка: {Haffman("beep boop beer!")}') +print(f'Исходная строка: "beep boop beer!"')