Compresión de texto con pérdida

9

Antecedentes

De los 256 caracteres posibles que puede representar un byte, solo algunos de estos se usan en la mayoría de las circunstancias. ¿No podríamos aprovechar esto de alguna manera y hacer que nuestros archivos de texto sean más pequeños al eliminar la necesidad de las letras raramente utilizadas?

Muchas letras no agregan ningún valor en la mayoría de las situaciones, y pueden reemplazarse por letras más comunes. Por ejemplo, una "L" en minúscula, una "I" mayúscula y el número "1" parecen casi idénticos en la mayoría de las situaciones, por lo que pueden consolidarse.

Hay poca necesidad de letras mayúsculas, por lo que se pueden prescindir de ellas. El programa de descompresión / visualización podría incluso poner en mayúscula automáticamente la primera letra de cada oración, nombres comunes, etc.

Reglas

Las entradas serán juzgadas por:

  • índice de compresión
  • legibilidad después de la descompresión

Las entradas se probarán con la versión de texto plano de este artículo: http://en.wikipedia.org/wiki/Babbage y un artículo de BBC News seleccionado al azar .

Se otorgarán marcas adicionales por; preservar cualquier marcado, embellecer después de la descompresión (es decir, poner en mayúscula las oraciones, etc.).

Idiomas

  • Cualquiera que desee, pero debe compilar fácilmente (o ser interpretado) en un cuadro básico * nix.
rjstelling
fuente
¿Entonces PowerShell está fuera? Gorrón.
Joey
1
Haskell:main = interact (\x -> take 90 x ++ " yada yada yada")
Joey Adams
1
Tenga en cuenta también que la "legibilidad después de la descompresión" es un criterio bastante subjetivo.
Joey
Especialmente en un Unix-Box, necesitamos la distinción mayúscula, minúscula. :) Y encontrar el comienzo de un enviado. No es trivial, si la u. Utiliza abreviatura! :)
usuario desconocido
¿Queremos comprimir el alfabeto o el texto? :) L = l = 1 comprime los caracteres necesarios para representar nuestros pensamientos. Pero "one apple" = "1 apl" comprime el texto.
anemgyenge

Respuestas:

11

Perl

Muy ineficiente y tiene malas tarifas. Requiere /usr/share/dict/words.

Compresor

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

Descompresor

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

Perl, 0 caracteres

Relación de compresión del infinito, aunque no tan legible después de la descompresión, por lo que perderá algunas marcas.

Ry-
fuente
2

Bash, 5 caracteres

Mi entrada perezosa que podría ganar:

bzip2

¡Sin pérdida, por lo que conserva la legibilidad perfectamente y obtiene todas las marcas adicionales! La relación de compresión en Babbage html es 4.79x (153804 a 32084 bytes).

Keith Randall
fuente
De alguna manera sabía que eso vendría con ese desafío ;-)
Joey
Eso va a ser difícil de superar.
Lowjacker
Ja! Lo
superé
2
xz, relación aún más corta y mejor :)
OneOfOne