#python #c #compression
#питон #c #компрессия
Вопрос:
Напишите алгоритм сжатия и распаковки для SIC, который работает следующим образом: найдите наиболее популярные символы и в порядке популярности назначьте им шестнадцатеричное значение от 0 до E, от F0 до FE, от FF0 до FFE и т. Д. Обратите внимание, что буква F указывает на то, что за этим последует еще несколько укусов, все остальное-это конечный укус.
Сожмите сообщение, заменив символы их назначенным значением. Ниже приведен пример текста, но код должен работать универсально для любого данного текста.
Тестовый случай:
текст = «Марли был мертв: для начала. В этом нет никаких сомнений. Реестр его похорон был подписан священником, клерком, гробовщиком и главным плакальщиком. Скрудж подписал его: и имя Скруджа было хорошо при Изменении, для всего, к чему он решал приложить руку. Старина Марли был мертв, как дверной гвоздь. Внимание! Я не хочу сказать, что я знаю, из моих собственных знаний, что особенно мертво в дверном гвозде. Я и сам мог бы склониться к тому, чтобы считать гвоздь для гроба самым мертвым предметом скобяных изделий в торговле. Но мудрость наших предков заключена в этом сравнении, и мои нечестивые руки не потревожат его, иначе Стране конец. Поэтому вы позволите мне решительно повторить, что Марли был мертв, как дверной гвоздь».
решение = «f826b1d0e2a08128fd0340f61f0750e739f50fe916107a054084cf630e9231ff01602f64c303923f5 0fe91061f07a31604f3097a0f6c672b0e2a0a7f05180f6d03910f2b16f0df125f403910f2b16f9f4039 10c581632f916f4025803910f2971f30f14c6516f50ff1f2644f010a7f0518073fd02580ff1f2644f01fa a052f110e2a0f04480cf7450faff2925f01f40f346025d3975f00910f294a10340f7c3097a09258034f 50ff3b80f826b1d0e2a02a0812802a0208446fb527bf50f8758ff40fc0845fa30f11250340a2d03923 0fc0f954ef404f30f1d04e50f954eb18f01f40e92303916107a0f72637f2cb26bd0812802f64c30208 446fb527bf50fc0f17f093092ff010f6115075f2b7518f40f1da1bf3f4034061f0268020f24f3f375fb52 7b02a0391081281a30f771f2104f307645f145f016d0750391036281f50ff5c303910e7a84f104f30 4c6025f21a346a07a07503910a7f17b1ff602580f1d0c592bb4e1809258a0a92bb0543087a3c6f6 073f404603910ff24c536dfaa084510f346f50ff74c0e7bb039161f34610f716f1730f11034061f7123 f401f1f79237f22bbdf4039230f826b1d0e2a02a0812802a0208446fb527bf5
Ответ №1:
Я добавляю код, который может помочь решить вашу проблему. Он запросит исходные данные, и вы сможете изменить их в соответствии с вашими потребностями.
from collections import Counter key = [] def initCompute(data): # here i am finding the unique chars and its occurrence to find the popular char uChar = list(set(data)) xCount = dict(Counter(data)) xCount = dict(sorted(xCount.items(), key=lambda item: item[1], reverse=True)) return len(uChar), xCount def compute(data, keyList, dataDict): # assigning the hex value(key) to the each characters j = 0 comDict = {} decdict = {} sol = "" for k in dataDict: comDict[k] = [keyList[j], dataDict[k]] decdict[keyList[j]] = k j = 1 for c in data: sol = comDict[c][0] return sol, decdict def decompression(keyDict, cData): # this is to find the decompressed data by having the dict of # hex value assigned to char and compressed data as inputs sol = "" fNib = "" for s in cData: if s == 'f': fNib = s else: fNib = s sol = keyDict[fNib] fNib = "" # print(sol) return sol def compression(): # find the key(hex value) and framing the compressed data i = 0 fac = 16 pwr = 1 keyLen, dDict = initCompute(text) while len(key) lt;= keyLen: if i lt;= (fac - 2): key.append(str(hex(i))[2:]) # finding the hex value and storing in key i = 1 else: pwr = 1 fac = pow(16, pwr) i = fac - 16 sol, newDict = compute(text, key, dDict) print("Assigned hex values for each character: ") print(newDict) return sol, newDict, keyLen if __name__ == '__main__': text = input("Input your Data here: ") # input compressed_data, new_dict, key_len = compression() print("Compressed data: ",compressed_data) print(compressed_data) print("Decompressed data:") print(decompression(new_dict, compressed_data))
Комментарии:
1. Спасибо за вышесказанное, как насчет того, чтобы сделать то же самое со счетчиком