Kayıplı Metin Sıkıştırma


9

Arka fon

Bir baytın temsil edebileceği olası 256 karakterden çoğu, bunlardan sadece birkaçı çoğu durumda kullanılır. Nadiren kullanılan harflere olan ihtiyacı ortadan kaldırarak bir şekilde bundan faydalanıp metin dosyalarımızı küçültemez miydik?

Birçok harf çoğu durumda herhangi bir değer katmaz ve daha yaygın harfler ile değiştirilebilir. Örneğin, küçük harfli "L", büyük harf "I" ve "1" sayısı çoğu durumda neredeyse aynı görünür, böylece birleştirilebilirler.

Büyük harflere çok az ihtiyaç vardır, bu yüzden bunlardan vazgeçilebilirler. Dekompresyon / görüntüleme programı otomatik olarak her cümlenin ilk harfini, ortak isimlerini vb. Büyük harflerle yazabilir.

kurallar

Girişler aşağıdakiler hakkında değerlendirilecektir:

  • Sıkıştırma oranı
  • sıkıştırmadan sonra okunabilirlik

Girişler bu makalenin düz metin versiyonuna göre test edilecektir: http://en.wikipedia.org/wiki/Babbage ve rastgele seçilmiş bir BBC News makalesi.

İçin ekstra puan verilecektir; herhangi bir işaretlemeyi korumak, sıkıştırmadan sonra güzelleştirmek (cümleleri büyük harf kullanmak vb.).

Diller

  • İstediğiniz, ancak temel bir * nix kutusunda kolayca derlenmesi (veya yorumlanması) gerekir.

PowerShell çıktı mı? Aylak.
Joey

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

1
Ayrıca, "dekompresyondan sonra okunabilirliğin" oldukça öznel bir kriter olduğuna dikkat edin.
Joey

Özellikle bir Unix-Box üzerinde, büyük, küçük harf ayrımına ihtiyacımız var. :) Ve gönderilen bir başlangıcını bulmak. Önemsiz değil, eğer u. Kısaltma kullanır.! :)
kullanıcı bilinmiyor

Alfabeyi veya metni sıkıştırmak istiyor muyuz? :) L = l = 1 düşüncelerimizi temsil etmek için gereken karakterleri sıkıştırır. Ancak "bir elma" = "1 apl" metni sıkıştırır.
anemgyenge

Yanıtlar:


11

Perl

Çok verimsiz ve kötü oranları var. Gerektirir /usr/share/dict/words.

Kompresör

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

Açıcı

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

Sonsuzluğun sıkıştırma oranı, ancak dekompresyondan sonra okunabilir değil, bu yüzden bazı izleri kaybedecektir.


2

Bash, 5 karakter

Sadece kazanabilecek tembel girişim:

bzip2

Kayıpsız, böylece okunabilirliği mükemmel bir şekilde korur ve tüm ekstra işaretleri alır! Babbage html'deki sıkıştırma oranı 4.79x'tur (153804 ila 32084 bayt).


Her nasılsa bu meydan okuma ile geliyor biliyordum ;-)
Joey

Yenmek zor olacak.
Lowjacker

Hah! Hem uzunluk hem de sıkıştırma oranında
yendim

2
xz, daha kısa ve daha iyi oran :)
OneOfOne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.