Неэффективная Схема Сжатия Прожектора

#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. Спасибо за вышесказанное, как насчет того, чтобы сделать то же самое со счетчиком