การบีบอัดข้อความแบบ Lossy


9

พื้นหลัง

จากอักขระที่เป็นไปได้ 256 ตัวที่ไบต์สามารถใช้แทนได้มีเพียงไม่กี่ตัวเท่านั้นที่ใช้ในสถานการณ์ส่วนใหญ่ เราไม่สามารถใช้ประโยชน์จากสิ่งนี้ได้และทำให้ไฟล์ข้อความของเราเล็กลงโดยไม่จำเป็นต้องใช้ตัวอักษรที่ใช้บ่อย

ตัวอักษรหลายตัวไม่เพิ่มมูลค่าใด ๆ ในสถานการณ์ส่วนใหญ่และสามารถแทนที่ด้วยตัวอักษรทั่วไปเพิ่มเติม ตัวอย่างเช่นตัวพิมพ์เล็ก "L" ตัวพิมพ์ใหญ่ "I" และตัวเลข "1" ดูเกือบจะเหมือนกันในสถานการณ์ส่วนใหญ่เพื่อให้สามารถรวมได้

มีความต้องการตัวอักษรพิมพ์ใหญ่เพียงเล็กน้อยดังนั้นพวกเขาจึงสามารถชำระด้วย โปรแกรมคลายการบีบอัด / การแสดงผลสามารถใช้อักษรตัวแรกของทุกประโยคชื่อสามัญ ฯลฯ ได้โดยอัตโนมัติ

กฎระเบียบ

ผลงานจะถูกตัดสินเมื่อ:

  • อัตราส่วนการบีบอัด
  • สามารถอ่านได้หลังจากการบีบอัด

รายการจะถูกทดสอบกับรุ่นข้อความธรรมดาของบทความนี้: http://en.wikipedia.org/wiki/Babbageและบทความข่าว BBC ที่สุ่มเลือก

จะได้รับคะแนนพิเศษสำหรับ; รักษาเครื่องหมายใด ๆ ที่สวยงามหลังจากการบีบอัด (เช่นประโยคทุน ฯลฯ )

ภาษา

  • ทุกคนที่คุณชอบ แต่ต้องรวบรวม (หรือตีความ) บนกล่อง * พื้นฐาน

ดังนั้น PowerShell ไม่ทำงาน คนเกียจคร้าน
Joey

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

1
โปรดทราบด้วยว่า "ความสามารถในการอ่านหลังจากคลายการบีบอัด" เป็นเกณฑ์ที่ค่อนข้างสมเหตุสมผล
Joey

โดยเฉพาะอย่างยิ่งใน Unix-Box เราจำเป็นต้องมีตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก :) และค้นหาจุดเริ่มต้นของการส่ง ไม่สำคัญถ้าคุณ ใช้ตัวย่อ! :)
ผู้ใช้ที่ไม่รู้จัก

เราต้องการบีบอัดตัวอักษรหรือข้อความหรือไม่? :) L = l = 1 บีบอัดอักขระที่จำเป็นเพื่อแสดงถึงความคิดของเรา แต่ "one apple" = "1 apl" บีบอัดข้อความ
anemgyenge

คำตอบ:


11

Perl

ไม่มีประสิทธิภาพมากและมีอัตราที่ไม่ดี /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;

decompressor

#!/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 ตัวอักษร

อัตราส่วนการบีบอัดของอินฟินิตี้แม้ว่าจะไม่สามารถอ่านได้หลังจากคลายการบีบอัดดังนั้นมันจะสูญเสียเครื่องหมายบางอย่าง


2

Bash, 5 ตัวอักษร

รายการที่ขี้เกียจของฉันที่เพิ่งจะชนะ:

bzip2

ไม่สูญเสียดังนั้นจึงสามารถอ่านได้อย่างสมบูรณ์และได้รับเครื่องหมายพิเศษทั้งหมด! อัตราส่วนการบีบอัดบน Babbage html คือ 4.79x (153804 ถึง 32084 bytes)


ยังไงก็เถอะฉันก็รู้ว่ามันมาพร้อมกับความท้าทายนั้น ;-)
Joey

มันจะยากที่จะเอาชนะ
Lowjacker

ฮะ! ฉันเอาชนะมันทั้งยาวและการบีบอัดอัตราส่วน;)
Ry-

2
XZ แม้สั้นกว่าและดีกว่าอัตราส่วน :)
OneOfOne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.