非可逆テキスト圧縮


9

バックグラウンド

1バイトが表すことができる256文字のうち、ほとんどの状況で使用されるのはこれらの文字のほんの一部です。どういうわけかこれを利用して、めったに使用されない文字の必要性を排除して、テキストファイルを小さくすることはできませんか?

多くの文字はほとんどの状況で値を追加せず、より一般的な文字に置き換えることができます。たとえば、小文字の「L」、大文字の「I」、および数値「1」はほとんどの状況でほとんど同じに見えるため、統合できます。

大文字はほとんど必要ないため、省略できます。解凍/表示プログラムは、すべての文、通称などの最初の文字を自動的に大文字にすることさえできます。

ルール

エントリーは次の項目で審査されます。

  • 圧縮比
  • 解凍後の可読性

エントリは、この記事のプレーンテキストバージョン(http://en.wikipedia.org/wiki/Babbage)とランダムに選択されたBBCニュース記事に対してテストされます。

追加のマークが授与されます。マークアップを保持し、解凍後に美化します(つまり、文を大文字にするなど)。

言語

  • 任意ですが、基本的な* nixボックスで簡単にコンパイル(または解釈)する必要があります。

PowerShellは出ましたか?残念。
ジョーイ

1
Haskell:main = interact (\x -> take 90 x ++ " yada yada yada")
ジョーイアダムス

1
「解凍後の読みやすさ」はかなり主観的な基準であることにも注意してください。
ジョーイ

特にUnix-Boxでは、大文字と小文字の区別が必要です。:)そして送信の始まりを見つける。uの場合、自明ではありません。略語を使用します。:)
ユーザー不明

アルファベットまたはテキストを圧縮しますか?:) L = l = 1は、思考を表すために必要な文字を圧縮します。しかし、「1つのリンゴ」=「1 apl」はテキストを圧縮します。
anemgyenge 2011

回答:


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

ロスレスなので、読みやすさを完全に保ち、余分なマークをすべて取得します。Babbage htmlの圧縮率は4.79x(153804から32084バイト)です。


どういうわけか私はそれがその挑戦と共に来ることを知っていました;-)
ジョーイ

それは打つのは難しいでしょう。
ロージャッカー2011

ハァッ!私は長さと圧縮比の両方でそれを打ちました;)
Ry-

2
xz、さらに短くより良い比率:)
OneOfOne 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.