diff --git "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" deleted file mode 100644 index 0bbcc43f..00000000 --- "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ /dev/null @@ -1,14 +0,0 @@ -""" -1. Подсчитать, сколько было выделено памяти под переменные в ранее -разработанных программах в рамках первых трех уроков. -Проанализировать результат и определить программы с -наиболее эффективным использованием памяти. -Примечание: Для анализа возьмите любые 1-3 ваших программы или несколько -вариантов кода для одной и той же задачи. -Результаты анализа вставьте в виде комментариев к коду. -Также укажите в комментариях версию Python и разрядность вашей ОС. - - -ВНИМАНИЕ: ЗАДАНИЯ, В КОТОРЫХ БУДУТ ГОЛЫЕ ЦИФРЫ ЗАМЕРОВ (БЕЗ АНАЛИТИКИ) -БУДУТ ПРИНИМАТЬСЯ С ОЦЕНКОЙ УДОВЛЕТВОРИТЕЛЬНО -""" diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" deleted file mode 100644 index 07560cfa..00000000 --- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ /dev/null @@ -1,11 +0,0 @@ -""" -1. Отсортируйте по убыванию методом "пузырька" одномерный целочисленный массив, -заданный случайными числами на промежутке [-100; 100). Выведите на экран -исходный и отсортированный массивы. Сортировка должна быть реализована в -виде функции. Обязательно доработайте алгоритм (сделайте его умнее). -Идея доработки: если за проход по списку не совершается ни одной сортировки, то завершение -Обязательно сделайте замеры времени обеих реализаций - -Подсказка: обратите внимание, сортируем не по возрастанию, как в примере, -а по убыванию -""" diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" deleted file mode 100644 index 73d3dfb6..00000000 --- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ /dev/null @@ -1,10 +0,0 @@ -""" -2. Отсортируйте по возрастанию методом слияния одномерный вещественный массив, -заданный случайными числами на промежутке [0; 50). Выведите на экран исходный -и отсортированный массивы. - -Пример: -Введите число элементов: 5 -Исходный - [46.11436617832828, 41.62921998361278, 18.45859540989644, 12.128870723745806, 8.025098788570562] -Отсортированный - [8.025098788570562, 12.128870723745806, 18.45859540989644, 41.62921998361278, 46.11436617832828] -""" diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" deleted file mode 100644 index 33530404..00000000 --- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" +++ /dev/null @@ -1,8 +0,0 @@ -""" -3. Массив размером 2m + 1, где m – натуральное число, заполнен случайным образом. -Найдите в массиве медиану. Медианой называется элемент ряда, делящий его на -две равные части: в одной находятся элементы, которые не меньше медианы, -в другой – не больше медианы. Задачу можно решить без сортировки исходного -массива. Но если это слишком сложно, то используйте метод сортировки, -который не рассматривался на уроках -""" diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index 045a8cc9..1cc334a4 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -16,3 +16,12 @@ Итог: 6 подстрок """ +from hashlib import sha1 + +user_input = input('Введите строку: ') +result = set() +for i in range(0, len(user_input) + 1): + for j in range(i + 1, len(user_input) + 1): + result.add(sha1(user_input[i:j].encode('utf-8')).hexdigest()) +result.remove(sha1(user_input.encode('utf-8')).hexdigest()) # удалим из множества введенную строку +print(f'Колличество различных подстрок в строке "{user_input}" равно {len(result)}') diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index 96b7bdec..dd71505b 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -8,3 +8,61 @@ Результат: 00 11 11 101 010 00 011 011 101 010 00 11 11 1000 1001 """ +import heapq # модуль для работы с мин. кучей из стандартной библиотеки Python +from collections import Counter # словарь в котором для каждого объекта поддерживается счетчик +from collections import namedtuple + + +# добавим классы для хранения информации о структуре дерева +# воспользуемся функцией namedtuple из стандартной библиотеки +class Node(namedtuple("Node", ["left", "right"])): # класс для ветвей дерева - внутренних узлов; у них есть потомки + def walk(self, code, acc): + # чтобы обойти дерево нам нужно: + self.left.walk(code, acc + "0") # пойти в левого потомка, добавив к префиксу "0" + self.right.walk(code, acc + "1") # затем пойти в правого потомка, добавив к префиксу "1" + + +class Leaf(namedtuple("Leaf", ["char"])): # класс для листьев дерева, у него нет потомков, но есть значение символа + def walk(self, code, acc): + # потомков у листа нет, по этому для значения мы запишем построенный код для данного символа + code[self.char] = acc or "0" # если строка длиной 1 то acc = "", для этого случая установим значение acc = "0" + + +def huffman_encode(s): # функция кодирования строки в коды Хаффмана + h = [] # инициализируем очередь с приоритетами + for ch, freq in Counter(s).items(): # постоим очередь с помощью цикла, добавив счетчик, уникальный для всех листьев + h.append((freq, len(h), Leaf(ch))) # очередь будет представлена частотой символа, счетчиком и самим символом + heapq.heapify(h) # построим очередь с приоритетами + count = len(h) # инициализируем значение счетчика длиной очереди + while len(h) > 1: # пока в очереди есть хотя бы 2 элемента + freq1, _count1, left = heapq.heappop(h) # вытащим элемент с минимальной частотой - левый узел + freq2, _count2, right = heapq.heappop(h) # вытащим следующий элемент с минимальной частотой - правый узел + # поместим в очередь новый элемент, у которого частота равна суме частот вытащенных элементов + heapq.heappush(h, (freq1 + freq2, count, Node(left, right))) # добавим новый внутренний узел у которого + # потомки left и right соответственно + count += 1 # инкрементируем значение счетчика при добавлении нового элемента дерева + code = {} # инициализируем словарь кодов символов + if h: # если строка пустая, то очередь будет пустая и обходить нечего + [(_freq, _count, root)] = h # в очереди 1 элемент, приоритет которого не важен, а сам элемент - корень дерева + root.walk(code, "") # обойдем дерева от корня и заполним словарь для получения кодирования Хаффмана + return code # возвращаем словарь символов и соответствующих им кодов + + +def main(): + user_input = input("Введите строку: ") # читаем строку длиной до 10**4 + code = huffman_encode(user_input) # кодируем строку + encoded = "".join(code[ch] for ch in user_input) # отобразим закодированную версию, отобразив каждый символ + # в соответствующий код и конкатенируем результат + print(len(code), len(encoded)) # выведем число символов и длину закодированной строки + for ch in sorted(code): # обойдем символы в словаре в алфавитном порядке с помощью функции sorted() + print("{}: {}".format(ch, code[ch])) # выведем символ и соответствующий ему код + print(encoded) # выведем закодированную строку + + +main() + +''' +Почитал статью в интерненте, от туда же и взял код решения. Так жы пытался разобраться в кодах +из урока, если быть откровенным, очень тяжело осмыслить. Понял не все. В начале вроде все понятно, +но чем дальше погружаешься в код, тем меньше ясности. Буду дальше учиться. Спасибо за курс. +'''