손실 텍스트 압축


9

배경

바이트가 표현할 수있는 256 개의 가능한 문자 중 대부분은 대부분의 상황에서 사용됩니다. 우리는 어떻게 든 이것을 이용할 수 없으며, 거의 사용되지 않는 문자가 필요 없어서 텍스트 파일을 작게 만들 수 없습니까?

대부분의 문자는 대부분의 상황에서 가치를 추가하지 않으며보다 일반적인 문자로 대체 될 수 있습니다. 예를 들어, 소문자 "L", 대문자 "I"및 숫자 "1"은 대부분의 상황에서 거의 동일하게 보이므로 통합 될 수 있습니다.

대문자가 거의 필요하지 않으므로 생략 할 수 있습니다. 압축 해제 / 디스플레이 프로그램은 모든 문장의 첫 글자, 공통 이름 등을 자동으로 대문자로 표시 할 수도 있습니다.

규칙

출품작은 다음과 같이 심사됩니다 :

  • 압축비
  • 압축 해제 후 가독성

출품작은이 기사의 일반 텍스트 버전 인 http://en.wikipedia.org/wiki/Babbage 및 임의로 선택된 BBC 뉴스 기사 에 대해 테스트됩니다 .

추가 마크가 수여됩니다. 마크 업 유지, 압축 해제 후 미화 (예 : 대문자 표기 등).

언어

  • 기본 * nix 상자에서 원하는대로 쉽게 컴파일 (또는 해석)해야합니다.

PowerShell이 ​​종료 되었습니까? 버머.
Joey

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

1
또한 "압축 해제 후 가독성"은 상당히 주관적인 기준입니다.
Joey

특히 Unix-Box에서는 대문자, 소문자가 필요합니다. :) 그리고 보낸 시작을 찾는 중입니다. u라면 사소하지 않습니다. abbrev를 사용합니다! :)
사용자가 알 수 없음

알파벳이나 텍스트를 압축하고 싶습니까? :) L = l = 1은 우리의 생각을 표현하는 데 필요한 문자를 압축합니다. 그러나 "one apple"= "1 apl"은 텍스트를 압축합니다.
anemgyenge

답변:


11

매우 비효율적이며 불량률이 있습니다. 필요합니다 /usr/share/dict/words.

압축기

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

압축 해 제기

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

펄, 0 자

압축 해제 후 읽을 수는 없지만 무한대의 압축 비율로 인해 일부 마크가 손실됩니다.


2

배쉬, 5 문자

이길 수도있는 게으른 입장 :

bzip2

무손실이므로 가독성을 완벽하게 유지하고 모든 추가 표시를 얻습니다! Babbage html의 압축 비율은 4.79x (153804 ~ 32084 바이트)입니다.


어쨌든 나는 그것이 그 도전과 함께 올 것이라는 것을 알았다 ;-)
Joey

이기는 것은 어려울 것입니다.
Lowjacker

하! 나는 길이와 압축 비율 모두에서 그것을 이겼다;)
Ry-

2
xz, 더 짧고 더 나은 비율 :)
OneOfOne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.