Compressione di testo con perdita


9

sfondo

Dei 256 possibili caratteri che un byte può rappresentare, solo alcuni di questi vengono utilizzati nella maggior parte dei casi. Non potremmo in qualche modo approfittarne e rendere più piccoli i nostri file di testo eliminando la necessità delle lettere usate raramente?

Molte lettere non aggiungono alcun valore nella maggior parte delle situazioni e possono essere sostituite da lettere più comuni. Ad esempio, una "L" minuscola, la "I" maiuscola e il numero "1" sembrano quasi identici nella maggior parte delle situazioni, quindi possono essere consolidati.

C'è poco bisogno di lettere maiuscole, quindi possono essere eliminate. Il programma di decompressione / visualizzazione potrebbe anche mettere automaticamente in maiuscolo la prima lettera di ogni frase, nomi comuni, ecc.

Regole

Le iscrizioni saranno valutate su:

  • rapporto di compressione
  • leggibilità dopo la decompressione

Le voci verranno testate rispetto alla versione in testo normale di questo articolo: http://en.wikipedia.org/wiki/Babbage e un articolo della BBC selezionato in modo casuale .

Verranno assegnati voti extra per; preservare l'eventuale mark-up, abbellire dopo la decompressione (ad esempio frasi in maiuscolo, ecc.).

Le lingue

  • Qualunque cosa ti piaccia, ma deve essere facilmente compilata (o interpretata) in una casella * nix di base.

Quindi PowerShell è uscito? Bummer.
Joey,

1
Haskell:main = interact (\x -> take 90 x ++ " yada yada yada")
Joey Adams,

1
Si noti inoltre che la "leggibilità dopo la decompressione" è un criterio abbastanza soggettivo.
Joey,

Soprattutto su una Unix-Box, abbiamo bisogno della distinzione maiuscola, minuscola. :) E trovare l'inizio di un inviato. Non è banale, se l'u. Usa abbrev.! :)
utente sconosciuto

Vogliamo comprimere l'alfabeto o il testo? :) L = l = 1 comprime i caratteri necessari per rappresentare i nostri pensieri. "One apple" = "1 apl" comprime il testo.
Anemgyenge,

Risposte:


11

Perl

Molto inefficiente e ha tassi negativi. Richiede /usr/share/dict/words.

Compressore

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

decompressore

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

Rapporto di compressione dell'infinito, sebbene non leggibile dopo la decompressione, quindi perderà alcuni segni.


2

Bash, 5 caratteri

La mia voce pigra che potrebbe vincere:

bzip2

Senza perdite, quindi conserva perfettamente la leggibilità e ottiene tutti i voti extra! Il rapporto di compressione su Babbage html è 4,79x (da 153804 a 32084 byte).


In qualche modo sapevo che sarebbe arrivato con quella sfida ;-)
Joey

Sarà difficile da battere.
Lowjacker,

Hah! L'ho battuto in lunghezza e rapporto di compressione;)
Ry

2
xz, rapporto ancora più breve e migliore :)
OneOfOne
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.