Verlustbehaftete Textkomprimierung

9

Hintergrund

Von den 256 möglichen Zeichen, die ein Byte darstellen kann, werden unter den meisten Umständen nur einige verwendet. Könnten wir das nicht irgendwie ausnutzen und unsere Textdateien verkleinern, indem wir die selten verwendeten Buchstaben überflüssig machen?

Viele Buchstaben bieten in den meisten Situationen keinen Mehrwert und können durch häufigere Buchstaben ersetzt werden. Beispielsweise sehen ein Kleinbuchstabe "L", ein Großbuchstabe "I" und die Zahl "1" in den meisten Situationen nahezu identisch aus, sodass sie konsolidiert werden können.

Großbuchstaben werden kaum benötigt, sodass auf sie verzichtet werden kann. Das Dekomprimierungs- / Anzeigeprogramm kann sogar automatisch den ersten Buchstaben jedes Satzes, gebräuchlicher Namen usw. großschreiben.

Regeln

Die Beiträge werden bewertet nach:

  • Kompressionsrate
  • Lesbarkeit nach Dekomprimierung

Die Beiträge werden anhand der Nur-Text-Version dieses Artikels getestet: http://en.wikipedia.org/wiki/Babbage und eines zufällig ausgewählten BBC News- Artikels.

Zusätzliche Noten werden vergeben für; Beibehaltung von Markups, Verschönerung nach Dekomprimierung (dh Großschreibung von Sätzen usw.).

Sprachen

  • Jeder, den Sie mögen, der aber auf einer einfachen * nix-Box leicht kompiliert (oder interpretiert) werden muss.
rjstelling
quelle
Also ist PowerShell raus? Schade.
Joey
1
Haskell:main = interact (\x -> take 90 x ++ " yada yada yada")
Joey Adams
1
Beachten Sie auch, dass "Lesbarkeit nach Dekompression" ein ziemlich subjektives Kriterium ist.
Joey
Insbesondere bei einer Unix-Box benötigen wir die Unterscheidung zwischen Groß- und Kleinschreibung. :) Und den Anfang eines gesendeten finden. Ist nicht trivial, wenn die u. Verwendet Abkürzung! :)
Benutzer unbekannt
Wollen wir das Alphabet oder den Text komprimieren? :) L = l = 1 komprimiert die Zeichen, die zur Darstellung unserer Gedanken benötigt werden. Aber "ein Apfel" = "1 apl" komprimiert den Text.
Anemgyenge

Antworten:

11

Perl

Sehr ineffizient und hat schlechte Preise. Benötigt /usr/share/dict/words.

Kompressor

#!/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;

Dekompressor

#!/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;
Ming-Tang
quelle
3

Perl, 0 Zeichen

Kompressionsverhältnis von unendlich, obwohl nach Dekomprimierung nicht so lesbar, so dass einige Markierungen verloren gehen.

Ry-
quelle
2

Bash, 5 Zeichen

Mein fauler Eintrag, der vielleicht gewinnen könnte:

bzip2

Verlustfrei, so dass die Lesbarkeit perfekt erhalten bleibt und alle zusätzlichen Noten erhalten werden! Das Komprimierungsverhältnis im Babbage-HTML beträgt 4,79x (153804 bis 32084 Byte).

Keith Randall
quelle
Irgendwie wusste ich, dass das mit dieser Herausforderung einherging ;-)
Joey
Das wird schwer zu schlagen sein.
Lowjacker
Hah! Ich habe es sowohl in der Länge als auch im Kompressionsverhältnis geschlagen;)
Ry
2
xz, noch kürzeres und besseres Verhältnis :)
OneOfOne