Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > сжатие строки (cgi скрипт)


Автор: annairam 27.3.2011, 21:03
Добрый вечер!Не могли бы вы помочь с написанием скрипта?

Сжатие строки
Один из простых способов сжатия информации заключается в поиске
одинаковых частей, идущих подряд. Вместо нескольких повторений
можно записать их количество и всего одну часть.
Задача.
  По заданной строке выдать её максимальное сжатие.
   Длинна получившейся строки считается вместе с числом. Длина
   числа - количество цифр в десятичной записи.

Техническое требования

  Задана строка не содержащая цифр. Длина входной строки
  не более 100 символов. Если вариантов сжатия несколько, то выдать любой.

ПРИМЕР

  Строка: ababababABabAbbccccccccccc
  Сжатие: 4ab1ABabAbb11c

Автор: Pfailed 27.3.2011, 21:45
http://search.cpan.org/perldoc?Compress::LZW

Автор: annairam 28.3.2011, 07:41
Надо что-то делать  с  этим?

" use Compress::LZW;
  
  my $compressed = compress($fatdata);
  my $fatdata    = decompress($compressed);
  
  my $smallcompressed = compress($thindata, 12);
  my $thindata        = decompress($smallcompressed, 12);"

один раз только скрипты писали(



Автор: alezzz 28.3.2011, 10:25
Вот такой вариант, может поможет:
Код

$str = "ababababABabAbbccccccccccc";
$str =~ s#(\w+?)\1+#length($&)/length($1).$1#ge;
print $str;


Результат: 4abABabA2b11c, так думаю правильнее

Автор: alezzz 28.3.2011, 14:47
Не учел случай когда нужна 1 перед неповторяющейся последовательностью, вот исправленый вариант:
Код

$str = "ababababABabAbbccccccccccc";
while($str =~ /(\w*?)(\w+?)\2+/g){
    $res .= "1".$1 if $1;
    $res .= (length($&) - length($1)) / length ($2) . $2;
}
print $res;

Автор: annairam 28.3.2011, 14:55
спасибо огромное!вроде все работает)))

Автор: annairam 28.3.2011, 18:01
Что то не работает сам cgi((((


Вот в html пишу 

<h2>  Второе задание по  CGI. </h2>
<form action="cgi-bin/pyp2.cgi" method=GET>
<input type="button" value="Справка" onClick='alert("Даннй скрипт по заданной строке выдает ее максимальное сжатие.");'><br>
<h4>Введите слово</h4>

<input type="text" name="qwe">
<input type=submit value="Проверить"> <input type=reset value="Сброс">

</form></div>


сам cgi написала так


#!/usr/bin/perl
$string = $ENV{'QUERY_STRING'};
@p = split (/&/, $string);
foreach $i (@p)
{
     ($name,$value)= split (/=/,$i);
};
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack ("C", hex ($1))/eg;
     if ($name eq "qwe"){
       $str=$value;}
print "Content-type: text/html; charset=KOI8-r \n\n";
     while($str =~ /(\w*?)(\w+?)\2+/g){
     $res .= "1".$1 if $1;
     $res .= (length($&) - length($1)) / length ($2) . $2;
}
print $res;





и в итоге никакого результата не выдается(по идее надо чтоб после того как пользователь 
ввел слово в эту форму он это слово сжимал.в самом perl  Ваш код работает когда слово задается
сразу,а вот тут уже нет.
может я что-то неправильно пишу?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)