Написать модуль, в котором будет 4 функции. Первые две: shex(n), которая переводит число n в 64-ричное представление, и xehs(s), которая переводит строку с 64-ричным числом в число. 64-ричная система счисления пользуется «цифрами» с ASCII-кодом от 32 до 32+63=95 (т. е. от пробела до подчёркивания) включительно. Функция encode(txt) упаковывает строку txt, состоящую из символов диапазона " "…"_" по следующим правилам. Символы, встретившиеся в тексте, упорядочиваются по убыванию частоты их появления в тексте (вторичный ключ — сам символ). Самому частому (и с наибольшим ASCII-кодом, если таковых несколько) ставится в соответствие бит "0", следующему — последовательность битов "10", следующему — "110", и т. д. Биты записываются единой строкой, строка дополняется нулями, если это необходимо, и превращается в 64-ричное число. Функция encode(txt) возвращает кортеж (длина txt, строка упорядоченных символов, закодированная строка). Четвёртая функция, decode(length, chars, code), раскодирует строку code, используя описанное выше сопоставление chars битам, и возвращает раскодированную строку длиной length.
print(xehs("BREAKFAST")) print(shex(10844745761445995)) res = encode("ENGINEERING WITHOUT MANAGEMENT IS ART.") print(res) txt = decode(*res) print(txt)
9792630319357172 FASTBREAK (38, 'NETI GARMWUSOH.', 'GW*_N?>_[M__?_O_;W^_/WU_IO=_][]_;__ ') ENGINEERING WITHOUT MANAGEMENT IS ART.
Спойлер:
- Вот словарь для текста:
'N':0 'E':10 'T':110 'I':1110 ' ':11110 'G':111110 'A':1111110 'R':11111110 'M':111111110 'W':1111111110 'U':11111111110 'S':111111111110 'O':1111111111110 'H':11111111111110 '.':111111111111110