Найти - Пользователи
Полная версия: Архиватор
Начало » Python для новичков » Архиватор
1
25flip
При обнаружении последовательности одинаковых байтов, она кодируется при помощи
двух байтов. Первый байт хранит количество повторов следующего за ним байтов.
Например, последовательность байт AAABBBBC, будет представлена в виде следующей
последовательности байт:
3, ‘A’, 4, ‘B’, 1, ‘C’
Таким образом, исходная 8-байтовая последовательность будет представлена при
помощи всего шести байт. Входные файлы нулевой длины представляются в виде выходных
файлов нулевой длины. Возможность появления последовательности одинаковых байтов
длиной более 255 байт исключена. Также очевидно, что однобайтовые последовательности
требуют в 2 раза больше данных.
Реализовать функцию распаковки.

кто что посоветует?
25flip
Я написал так, кто нибудь может проще?
# -*- coding: cp1251 -*-
import re

s,match,b = 'abbcccddddfjja','',''
t = []

for i in s:
if i == b: continue
b = i
pattern = '%s{1,}' % i
match = re.search(pattern, s)
s_ = str(len(match.group())) + match.group()
t.append(s_[:2])
#match = re.sub(pattern, s_[:2], s)
print 'строка: ' + s + '\n' + 'заархивирована: ' + str(t)

s = ''
for i in t:
s += int(i[0])*i[1]
print "разархивирована: " + s
Андрей Светлов
А если без регулярок? Перебирайте байты, не стесняйтесь.
25flip
Андрей Светлов
А если без регулярок? Перебирайте байты, не стесняйтесь.
ну и как их перебирать к примеру?
Андрей Светлов
По одному.
def arc(src):
symbol = None
count = 0
for i in src:
if i != symbol:
if count:
yield count, symbol
symbol = i
count = 1
else:
count += 1
if count:
yield count, symbol

def pack(src):
return ''.join(chr(count) + symbol for count, symbol in arc(src))

assert [] == list(arc(''))

assert ([(1, 'a'),
(2, 'b'),
(3, 'c'),
(1, 'd'),
(2, 'e')] == list(arc('abbcccdee')))

s = pack('abbcccdee')

assert '01610262036301640265' == s.encode('hex')
#print s.encode('hex')
PooH
25flip
ну и как их перебирать к примеру?
Впрямую:
def encode(s):
result, last_c, count = '', '', 0
for c in s:
if c != last_c and count:
result += "%s%d" % (last_c, count)
count = 1
else:
count += 1
last_c = c
result += "%s%d" % (last_c, count)
return result


print encode("ABBBBC")
print encode("AAABBBBC")
print encode("AAABBBB")
print encode("AAABBBBCC")
o7412369815963
эту задачу вроде уже решали… см поиск
Андрей Светлов
Чукча - писатель…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB