Форум сайта python.su
При обнаружении последовательности одинаковых байтов, она кодируется при помощи
двух байтов. Первый байт хранит количество повторов следующего за ним байтов.
Например, последовательность байт AAABBBBC, будет представлена в виде следующей
последовательности байт:
3, ‘A’, 4, ‘B’, 1, ‘C’
Таким образом, исходная 8-байтовая последовательность будет представлена при
помощи всего шести байт. Входные файлы нулевой длины представляются в виде выходных
файлов нулевой длины. Возможность появления последовательности одинаковых байтов
длиной более 255 байт исключена. Также очевидно, что однобайтовые последовательности
требуют в 2 раза больше данных.
Реализовать функцию распаковки.
кто что посоветует?
Отредактировано (Окт. 15, 2010 10:25:14)
Офлайн
Я написал так, кто нибудь может проще?
# -*- 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
Офлайн
А если без регулярок? Перебирайте байты, не стесняйтесь.
Офлайн
Андрей Светловну и как их перебирать к примеру?
А если без регулярок? Перебирайте байты, не стесняйтесь.
Офлайн
По одному.
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')
Офлайн
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")
Отредактировано (Окт. 15, 2010 12:31:55)
Офлайн
эту задачу вроде уже решали… см поиск
Офлайн
Чукча - писатель…
Офлайн