![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сжатие строки
SniZ © (2005-06-09 00:13:00)привет всем, подскижите как сжать строку, вернее есть набор символов в файле, ну типа вот:
uuuuuuuuuuuusssuuuuuuuuueeeeeennnnnuueeeeeee
затем нужно типа сжать это все в виде таком: (r)S, где r -количество символов, не меньшее 3, а S - символ, кароче нужно преобразовать эту строку в :
(12)u(3)s(9)u(6)e(5)nuu(7)e
а там где меньше трёх символов, просто оставлять, не трогать,
помогите плиззз
Юрий Зотов (2005-06-09 02:35:00) [21]> Defunct © (09.06.05 01:51) [15]
> не могу сказать кто его открыл .
Так я и не об этом спрашивал. А о том, кто его отрыл .
:о)
jack128 (2005-06-09 02:05:00) [22]Defunct © (09.06.05 1:51) [15]
Имел в виду, что формат такого кодирования является открытым - "свободным для использования и модификации в своих приложениях" в отличие от RAR
Гм.. Вроде как формат не может быть запотентован.. Так что любое приложение может использовать формат рар'а если смеет его взломать. Под открытым/закрытым форматом обычно имеется в виду наличие документации на него..
Defunct (2005-06-09 01:51:00) [23]Юрий Зотов © (09.06.05 01:46) [14]
Простите мое невежество, я не помню фамилии авторов. Поэтому не могу сказать кто его открыл. Имел в виду, что формат такого кодирования является открытым - "свободным для использования и модификации в своих приложениях" в отличие от RAR и т.п.
Юрий Зотов (2005-06-09 01:46:00) [24]> Defunct © (09.06.05 01:41) [13]
> Стандартный PCX формат.
Это да. Но кто ж его отрыл ?
:о)
Defunct (2005-06-09 01:41:00) [25]Юрий Зотов © (09.06.05 01:31) [12]
Прошу прощения, если Вам мой юмор не понравился.
Только что с "пива" так, что мог чего-то не то сболтнуть.
Но право же наставления мне понравились. Ничего личного.
Скромно, добавляю свою "imho"
> Это уже интереснее. А кто ж его отрыл?
Честно говоря, я думал Вы прекрасно знакомы с PCX форматом, в котором, для кодирования длины цепочки ипользуются значения байта от 224 до 255 (224 - 1, 225 - 2 и т.д). Если же символ встречается однократно, тогда длина просто не ставится, если символ больше либо равен 224, тогда кодируется двумя символами (224:код символа). Стандартный PCX формат.
Юрий Зотов (2005-06-09 01:31:00) [26]> Defunct © (09.06.05 01:19) [10]
> ну прям-таки барские наставления.
Я рад, что Вам понравилось, но Вы скромно забыли добавить "ИМХО". Пожалуйста, не забывайте об этом, ладно? А то прям-таки барство какое-то с Вашей стороны получается. ИМХО.
Еще одно мое ИМХО такое: код дан, как выход из тупика, но не как выход из ситуации - так что человеку все же придется поработать самостоятельно (что, собственно, от него и требовалось). Просто теперь у него есть над чем работать, вот и вся разница.
> PCX давно отрытый формат
Это уже интереснее. А кто ж его отрыл?
SniZ (2005-06-09 01:25:00) [27]большое спасибо, код прекрасный, но он попросил только прогу
ыыы, повезло
Defunct (2005-06-09 01:19:00) [28]> Юрий Зотов
ну прям-таки барские наставления. ;>
PCX давно отрытый формат ;>
Юрий Зотов (2005-06-09 01:13:00) [29]> SniZ
Вот решение, точно соответствующее Вашей постановке задачи:
function PackString(S: string): string;
function GetChainLength(const S: string): integer;
begin
Result := 0;
while (Result < Length(S)) and (S[Result + 1] = S[1]) do
Inc(Result)
end;
var
Len: integer;
begin
Result := '';
Len := GetChainLength(S);
while Len > 0 do
begin
if Len > 2 then
Result := Result + Format('(%d)%s', [Len, S[1]])
else
Result := Result + Copy(S, 1, Len);
Delete(S, 1, Len);
Len := GetChainLength(S)
end
end;
Но имейте в виду 2 вещи.
1. Преподаватель - не дурак. О том, что существуют подобные форумы он прекрасно знает. Еще по стилю кода он обязательно поймет, что написан этот код вовсе не новичком. Поэтому вряд ли Вам удастся защитить работу, если Вы досконально не разберетесь буквально в каждой букве кода - что это, зачем оно нужно и почему сделано именно так, а не иначе.
2. Ваша постановка задачи содержит погрешность, из-за которой сжатая строка не получается минимальной, она могла бы быть и меньше. Поскольку код точно соответствует постановке задачи, то он, естественно, содержит ту же самую погрешность. Вам нужно найти и исправить эту погрешность самостоятельно, иначе Вы тоже вряд ли сумеете защитить работу.
SniZ (2005-06-09 01:04:00) [30]да сорри, просто завтра лаб-раб сдавать
Gero (2005-06-09 00:58:00) [31]
> уууу, блин, ыыы
Ну ты же не в зоопарке.
SniZ (2005-06-09 00:54:00) [32]уууу, блин, ыыы, завтра сдавать....
Просто Джо (2005-06-09 00:38:00) [33]
> а вот подсчитать не магу, не умею, гы,
С этим -- в школу, там учат считать.
Eraser (2005-06-09 00:28:00) [34]SniZ © (09.06.05 00:24) [3]
Ну дык в чём проблема?
Должно выглядеть примерно так:
if s[i] <> s[i + 1] then
...
else
...
SniZ (2005-06-09 00:24:00) [35]нет, файл вывода должен быть таким как я написал, а вот подсчитать не магу, не умею, гы,
Lenka (2005-06-09 00:22:00) [36]я б сделала так: просто подсчитать количество одинаковых букв подряд, если их больше 3 тогда записать в новую строку в скобках количество плюс прилепить сам символ, а если меньше трех, тогда просто переписать в ту новую строку.
Eraser (2005-06-09 00:22:00) [37]SniZ © (09.06.05 00:13)
Используй Zlib, имеется в комплекте с делфи.