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..5a9c883e 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,26 @@ Итог: 6 подстрок """ +import hashlib + +s1 = 'qwerty' +s = s1[:] +l = [] +n = len(s) +print(f'Строка: {s1}\nПодстроки:') + +while n != 0: + for i in range(1, len(s) + 1): + if s[0:i] != s1 and s[0:i] not in l: + l.append(s[0:i]) + print(s[0:i]) + n -= 1 + s = s[1:] + +r = set([hashlib.sha1(el.encode('utf-8')).hexdigest() for el in l]) +print(f'Итог: {len(r)} подстрок') +print(r) + +del l, s1, s, n +# Писал сам, в итоге немного задваивается при длине строки равной 4, но в других местах такого нет, +# да и задваивание решается проверкой или добавлением в множество. 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..a4142845 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,56 @@ Результат: 00 11 11 101 010 00 011 011 101 010 00 11 11 1000 1001 """ +from collections import deque, Counter + + +def haffman_code(s): + c = Counter(s) + d = deque(sorted(c.items(), key=lambda el: el[1])) + if len(d) != 1: + while len(d) > 1: + weight = d[0][1] + d[1][1] + two = { + 0: d.popleft()[0], + 1: d.popleft()[0] + } + + for i in range(len(d)): + if d[i][1] >= weight: + d.insert(i, (two, weight)) + break + else: + d.append((two, weight)) + else: + weight = d[0][1] + two = { + 0: d.popleft()[0], + 1: None + } + d.append((two, weight)) + return d[0][0] + + +def rec_haf(tree, path=''): + if not isinstance(tree, dict): + res[tree] = path + else: + rec_haf(tree[0], path=f'{path}0') + rec_haf(tree[1], path=f'{path}1') + + +s = 'Удивительно, но работает!' +# s = "beep boop beer!" + +res = dict() +tree = haffman_code(s) +rec_haf(tree) +for el in s: + print(res[el], end=' ') +print() +for key, items in res.items(): + print(f'{key} - {items}') + +# Также писал сам, но пришлось довольно часто заглядывать, в итоге не сильно отошел от примера, +# но разобрался со всем, даже на листочке самостоятельно расписал как +# дерево строится для лучшего понимания