Compressão de texto com perdas


9

fundo

Dos 256 caracteres possíveis que um byte pode representar, apenas alguns deles são usados ​​na maioria das circunstâncias. De alguma forma, não poderíamos tirar proveito disso e diminuir nossos arquivos de texto, eliminando a necessidade de letras raramente usadas?

Muitas letras não agregam valor na maioria das situações e podem ser substituídas por letras mais comuns. Por exemplo, um "L" minúsculo, um "I" maiúsculo e o número "1" parecem quase idênticos na maioria das situações, para que possam ser consolidados.

Há pouca necessidade de letras maiúsculas, para que possam ser dispensadas. O programa de descompressão / exibição pode até colocar automaticamente em maiúscula a primeira letra de cada frase, nomes comuns etc.

Regras

As inscrições serão julgadas em:

  • taxa de compressão
  • legibilidade após descompressão

As inscrições serão testadas com base na versão em texto simples deste artigo: http://en.wikipedia.org/wiki/Babbage e em um artigo da BBC News selecionado aleatoriamente .

Marcas extras serão concedidas por; preservar qualquer marcação, embelezar após descompressão (ou seja, colocar em maiúsculas etc).

línguas

  • O que você quiser, mas deve ser facilmente compilado (ou interpretado) em uma caixa básica * nix.

Então o PowerShell está fora? Vadio.
JoeyAbr

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

11
Observe também que "legibilidade após descompressão" é um critério bastante subjetivo.
11119 Joey

Especialmente em um Unix-Box, precisamos da distinção maiúscula e minúscula. :) E encontrar o início de um enviado. Não é trivial, se você. Usa abrev. :)
usuário desconhecido

Queremos comprimir o alfabeto ou o texto? :) L = l = 1 comprime os caracteres necessários para representar nossos pensamentos. Mas "uma maçã" = "1 apl" compacta o texto.
Anemgyenge

Respostas:


11

Perl

Muito ineficiente e com taxas ruins. Requer /usr/share/dict/words.

Compressor

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

Descompressor

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

Taxa de compressão do infinito, embora não seja legível após a descompressão, para que perca algumas marcas.


2

Bash, 5 caracteres

Minha entrada preguiçosa que apenas pode ganhar:

bzip2

Sem perdas, preserva perfeitamente a legibilidade e recebe todas as notas extras! A taxa de compactação no html Babbage é de 4,79x (153804 a 32084 bytes).


De alguma forma eu sabia que estava vindo com esse desafio ;-)
Joey

Vai ser difícil de vencer.
Lowjacker

Hah! Eu bater que em ambos razão comprimento e compressão;)
Ry-

2
xz, ainda mais curto e melhor relação :)
OneOfOne
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.