Compression de texte avec perte

9

Contexte

Sur les 256 caractères possibles qu'un octet peut représenter, seuls quelques-uns d'entre eux sont utilisés dans la plupart des cas. Ne pourrions-nous en tirer quelque avantage et réduire la taille de nos fichiers texte en éliminant le besoin de lettres rarement utilisées?

De nombreuses lettres n'ajoutent aucune valeur dans la plupart des situations et peuvent être remplacées par des lettres plus courantes. Par exemple, un «L» minuscule, un «I» majuscule et le nombre «1» sont presque identiques dans la plupart des situations, afin de pouvoir être consolidés.

Les lettres majuscules étant peu nécessaires, elles peuvent donc être supprimées. Le programme de décompression / affichage pourrait même automatiquement mettre en majuscule la première lettre de chaque phrase, les noms communs, etc.

Règles

Les candidatures seront jugées sur:

  • ratio de compression
  • lisibilité après décompression

Les entrées seront testées par rapport à la version en texte brut de cet article: http://en.wikipedia.org/wiki/Babbage et un article de BBC News sélectionné au hasard .

Des points supplémentaires seront attribués pour; en préservant toute majoration, en embellissant après la décompression (c.-à-d. capitaliser des phrases, etc.).

Les langues

  • Tous ceux que vous aimez, mais doivent facilement compiler (ou être interprétés) sur une boîte de base * nix.
rjstelling
la source
Alors PowerShell est sorti? Bummer.
Joey
1
Haskell:main = interact (\x -> take 90 x ++ " yada yada yada")
Joey Adams
1
A noter également que la "lisibilité après décompression" est un critère assez subjectif.
Joey
Surtout sur Unix-Box, nous avons besoin de la distinction majuscule, minuscule. :) Et trouver le début d'un envoi. N'est-ce pas trivial, si le u. Utilise l'abrév.! :)
utilisateur inconnu
Voulons-nous compresser l'alphabet ou le texte? :) L = l = 1 compresse les caractères nécessaires pour représenter nos pensées. Mais "une pomme" = "1 apl" comprime le texte.
anemgyenge du

Réponses:

11

Perl

Très inefficace et a de mauvais taux. Requiert /usr/share/dict/words.

Compresseur

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

Décompresseur

#!/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
la source
3

Perl, 0 caractère

Taux de compression de l'infini, bien qu'il ne soit pas lisible après décompression, il perdra donc quelques marques.

Ry-
la source
2

Bash, 5 caractères

Mon entrée paresseuse qui pourrait bien gagner:

bzip2

Sans perte, il préserve donc parfaitement la lisibilité et obtient toutes les notes supplémentaires! Le taux de compression sur le html Babbage est de 4,79x (153804 à 32084 octets).

Keith Randall
la source
D'une certaine manière, je savais que ce défi allait venir ;-)
Joey
Ça va être difficile à battre.
Lowjacker
Hah! Je l'ai battu à la fois en longueur et en taux de compression;)
Ry-
2
xz, rapport encore plus court et meilleur :)
OneOfOne