有损文本压缩


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压缩表示我们的思想所需的字符。但是“ one apple” =“ 1 apl”会压缩文本。
anemgyenge 2011年

Answers:


11

佩尔

效率很低,费率很差。需要/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

无损,因此可以完美保留可读性并获得所有额外的标记!Babbage html上的压缩率为4.79x(153804至32084字节)。


我不知何故面临着挑战;-)
Joey

那将很难被击败。
Lowjacker 2011年

哈哈!我在长度和压缩率上都击败了它;)
Ry- 2011年

2
xz,甚至更短和更好的比率:)
OneOfOne 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.