Nén văn bản mất dữ liệu


9

Lý lịch

Trong số 256 ký tự có thể mà một byte có thể biểu thị, chỉ một vài trong số này được sử dụng trong hầu hết các trường hợp. Chúng ta không thể bằng cách nào đó tận dụng lợi thế này và làm cho các tệp văn bản của chúng ta nhỏ hơn bằng cách loại bỏ sự cần thiết của các chữ cái hiếm khi được sử dụng?

Nhiều chữ cái không thêm bất kỳ giá trị nào trong hầu hết các tình huống và có thể được thay thế bằng các chữ cái phổ biến hơn. Ví dụ: chữ "L" viết thường, viết hoa "I" và số "1" trông gần giống nhau trong hầu hết các tình huống, vì vậy chúng có thể được hợp nhất.

Có rất ít nhu cầu về chữ in hoa, vì vậy chúng có thể được phân phối. Chương trình giải nén / hiển thị thậm chí có thể tự động viết hoa chữ cái đầu tiên của mỗi câu, tên thông thường, v.v.

Quy tắc

Bài dự thi sẽ được đánh giá trên:

  • tỷ lệ nén
  • khả năng đọc sau khi nén

Các bài dự thi sẽ được kiểm tra dựa trên phiên bản văn bản đơn giản của bài viết này: http://en.wikipedia.org/wiki/Babbage và một bài báo được chọn ngẫu nhiên của BBC News .

Điểm thêm sẽ được trao cho; giữ bất kỳ đánh dấu, làm đẹp sau khi khử (nghĩa là viết hoa câu v.v.).

Ngôn ngữ

  • Bất kỳ bạn thích, nhưng phải dễ dàng biên dịch (hoặc được giải thích) trên hộp * nix cơ bản.

Vậy PowerShell đã hết? Bummer.
Joey

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

1
Cũng lưu ý rằng "khả năng đọc sau khi giải nén" là một tiêu chí khá chủ quan.
Joey

Đặc biệt trên Unix-Box, chúng ta cần phân biệt chữ hoa, chữ thường. :) Và tìm kiếm sự bắt đầu của một gửi. Không phải là tầm thường, nếu u. Sử dụng viết tắt.! :)
người dùng không xác định

Bạn có muốn nén bảng chữ cái hoặc văn bản? :) L = l = 1 nén các ký tự cần thiết để thể hiện suy nghĩ của chúng ta. Nhưng "một quả táo" = "1 apl" nén văn bản.
Anemgyenge

Câu trả lời:


11

Perl

Rất không hiệu quả và có tỷ lệ xấu. Yêu cầu /usr/share/dict/words.

Máy nén

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

Giải nén

#!/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 ký tự

Tỷ lệ nén của vô cực, mặc dù không thể đọc được sau khi giải nén nên sẽ mất một số dấu.


2

Bash, 5 ký tự

Mục lười biếng của tôi có thể giành chiến thắng:

bzip2

Không mất mát, vì vậy nó bảo tồn khả năng đọc hoàn hảo và được tất cả các điểm thêm! Tỷ lệ nén trên Babbage html là 4,79x (153804 đến 32084 byte).


Bằng cách nào đó tôi biết rằng điều đó đang đến với thử thách đó ;-)
Joey

Điều đó sẽ rất khó để đánh bại.
Lowjacker

Hừ! Tôi đánh bại nó ở cả chiều dài và tỷ lệ nén;)
Ry-

2
xz, thậm chí tỷ lệ ngắn hơn và tốt hơn :)
OneOfOne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.