Стиснення тексту втрат


9

Фон

З 256 можливих символів, які байт може представляти, лише деякі з них використовуються в більшості обставин. Чи не могли б ми якось скористатися цим і зробити наші текстові файли меншими, усунувши необхідність рідко використовуваних букв?

Багато листів не додають значення в більшості ситуацій, і їх можна замінити більш звичайними літерами. Наприклад, малі регістри "L", велика літера "I" і число "1" виглядають майже однаковими в більшості ситуацій, тому їх можна консолідувати.

У великих літерах мало потреби, тому їх можна не обходити. Програма декомпресії / відображення може навіть автоматично використовувати великі літери кожного речення, загальні імена тощо.

Правила

Записи будуть оцінені:

  • коефіцієнт стиснення
  • читабельність після декомпресії

Записи будуть перевірені на основі текстової версії цієї статті: http://en.wikipedia.org/wiki/Babbage та випадково вибраної статті Новини BBC .

Додаткові бали будуть присуджені за; збереження будь-яких націнок, прикрашання після депресії (тобто написання великих речень тощо).

Мови

  • Все, що вам подобається, але має легко збиратися (або тлумачитися) на основному * nix полі.

Так PowerShell вийшов? Бампер.
Joey

1
Haskell:main = interact (\x -> take 90 x ++ " yada yada yada")
Joey Adams

1
Зауважимо також, що "читабельність після декомпресії" є досить суб'єктивним критерієм.
Joey

Особливо на Unix-Box, нам потрібні великі регістри, малі регістри. :) І знаходження початку відправленого. Не банально, якщо і. Використовує абревіатуру! :)
користувач невідомий

Чи хочемо ми стиснути алфавіт чи текст? :) L = l = 1 стискає символів, необхідних для представлення наших думок. Але "одне яблуко" = "1 апл" стискає текст.
anemgyenge

Відповіді:


11

Perl

Дуже неефективний і має погані ставки. Вимагає /usr/share/dict/words.

Компресор

#!/usr/bin/perl

$M = 2;
$N = 1;
$Min = 3;
$Max = 8;

while (<>) {
  for (split /\s+/) {
    s/[^a-z]//i;
    ($p) = m/([^a-z]*)$/;
    $_ = lc $_;
    $l = (length $_) - (length $p);
    s/^and$/A/;
    s/^he$/H/;
    s/^in$/I/;
    s/^of$/O/;
    s/^you$/U/;
    s/^the$/Z/;
    if (length $_ >= $Min) {
      if (length $_ <= $Max) {
        s/ed/D/g;
        s/ing\b/N/g;
        s/er/R/g;
        s/'s/S/g;
        s/th/T/g;
        s/[aeo]{1,2}//g;
        $_ .= $l;
      } else {
        s/^(.{$M})(.+)(\w{$N})$/$1.(length$2).$3/e;
      }
    }
    $a .= $_ . $p . ' ';
  }
}
print $a;

Декомпресор

#!/usr/bin/perl

$M = 2;
$N = 1;

open D, '/usr/share/dict/words';
chomp, push @W, $_ while <D>;
close D;

while (<>) {
  for (split /\s+/) {
    ($_, $p) = m/^(.+)([^a-z]*)$/;
    s/^A$/and/;
    s/^H$/he/;
    s/^I$/in/;
    s/^O$/of/;
    s/^U$/you/;
    s/^Z$/the/;
    if ($_ =~ m/^(\w{$M})(\d+)(\w{$N})$/) {
      $r = '^' . quotemeta($1) . ('\w' x $2) . quotemeta($3) . '$';
      ($_) = (grep /$r/, @W);
      $_ .= $4;
    } else {
      ($_, $l) = m/^(.+)(\d+)$/;
      s/D/ed/g;
      s/N/ing/g;
      s/R/er/g;
      s/S/'s/g;
      s/T/th/g;
      $r = '[aeo]{0,2}';
      for $y(split //) { $r .= (quotemeta $y) . '[aiueo]{0,2}' }
      ($_) = (grep /^(?=[a-z]{$l})$r$/, @W);
    }
    $a .= $_ . $p . ' ';
  }
}
print $a;

3

Perl, 0 символів

Коефіцієнт стиснення нескінченності, хоча не такий читабельний після декомпресії, тому він втратить деякі позначки.


2

Баш, 5 символів

Мій ледачий запис, який просто може виграти:

bzip2

Без втрат, тому він прекрасно зберігає читабельність і отримує всі додаткові оцінки! Коефіцієнт стиснення на html Babbage становить 4,79x (153804 до 32084 байт).


Я якось знав, що йдеться з цим викликом ;-)
Джої,

Це буде важко перемогти.
Lowjacker

Га! Я обіграв це як по довжині, так і по відношенню до стиснення;)
Ри-

2
xz, ще коротше і краще співвідношення :)
OneOfOne
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.