การบีบอัดแบบผูกขาด


17

รับสตริงที่แสดงถึงสถานะปัจจุบันของเกมMonopolyที่จุดเริ่มต้นของการเปิดของผู้เล่นบีบอัดข้อมูลที่จำเป็นทั้งหมดลงในเอาต์พุตที่เล็กที่สุด คำตอบจะถูกตัดสินโดยขนาดของการส่งออกและขนาดแหล่งที่มา

หมายเหตุ: มีหลายรูปแบบในภูมิภาค แต่การอ้างอิงทั้งหมดในโพสต์นี้ไปยังชื่อทรัพย์สิน ฯลฯ อ้างอิงจากบอร์ดนี้


การป้อนข้อมูล:

อินพุตจะถูกกำหนดเป็น;สตริงที่แยกเดี่ยว สตริงนี้มอบให้กับโปรแกรมในลักษณะใดก็ตามที่เป็นธรรมเนียมในภาษาที่คุณเลือกไม่ว่าจะเป็น stdin, อาร์กิวเมนต์ ฯลฯ

อินพุตที่ยังไม่ฟอร์แมตจะมีลักษณะดังนี้:

numPlayers                     (1 to 8)
whose turn                     (0 to numPlayers-1)
for each player:
    bankrupt?                  (true/false)
    money                      (0 to 2^16-1)
    get-out-of-jail-free cards (0 to 2)
    position                   (0 to 39) 
    jail turns                 (-1 to 2)
for 28 properties:
    owner                      (-1 to numPlayers-1)
    mortgaged?                 (true/false)
    improvement level          (0 to 5)
for 16 chance cards in deck:
    card index                 (-1 to 15)
for 16 community chest cards in deck:
    card index                 (-1 to 15)

ตัวอย่างการจัดรูปแบบอินพุตคือ:

3;1;false;1546;0;14;-1;false;7692;1;10;1;true;1;false;1;1;false;0;0;true;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;3;12;7;4;5;2;13;11;15;6;8;9;10;1;14;-1;

ถ่ายทีละนิด:

3;1;

มีผู้เล่น 3 คนและมันคือเทิร์นของผู้เล่น 1 (ดัชนีเป็นศูนย์ดังนั้นผู้เล่นคนที่สอง )

ผู้เล่น

false;1546;0;14;-1;
false;7692;1;10;1;
true;

ผู้เล่นคนแรก:

  • ไม่ล้มละลาย
  • มีเงินสด $ 1546 ในมือ
  • เป็นเจ้าของบัตร 0 ใบปลอดการจำคุก
  • อยู่ในตำแหน่ง 14 (Virginia Ave)
  • ไม่ได้อยู่ในคุก

ผู้เล่นคนที่สองอยู่ในคุกและได้รับในครั้งเดียว ฉันไม่แน่ใจว่าทำไมเพราะเขามีการ์ด GOoJF แต่เขาอยู่ที่นั่น

ผู้เล่นคนที่สามเป็นบุคคลล้มละลายและไม่จำเป็นต้องมีข้อมูลเพิ่มเติม

คุณสมบัติ

1;false;1;
1;false;0;
0;true;0;
-1;false;0;
-1;false;0;
-1;false;0;
...

คุณสมบัติมีการระบุไว้ในคำสั่งทั่วกระดานเริ่มต้นจากเมดิเตอร์เรเนียนและสิ้นสุดที่ Boardwalk คุณสมบัติที่ไม่สามารถเป็นเจ้าของจะไม่รวมอยู่ในรายการนี้ดังนั้นจะมีทั้งหมด 28 รายการระดับการปรับปรุง0หมายถึงไม่มีการปรับปรุง ระดับ1คือบ้านหลังหนึ่งถึงระดับ5สำหรับโรงแรม -1สำหรับวิธีการใช้มันไม่ได้เป็นเจ้าของโดยผู้เล่นคนใด

ตามกฎมาตรฐานทรัพย์สินที่จำนองต้องเป็นเจ้าของและต้องไม่ปรับปรุง ทรัพย์สินที่ได้รับการปรับปรุงจะต้องเป็นของเจ้าของและจะต้องไม่ถูกจำนอง

นอกจากนี้เพื่อให้คุณสมบัติได้รับการปรับปรุงผู้เล่นจะต้องเป็นเจ้าของบล็อคสีทั้งหมด สำหรับวัตถุประสงค์ของเกมนี้เราไม่สนใจว่าคุณสมบัติจะได้รับการปรับปรุง "สม่ำเสมอ"

โปรดทราบว่าตำแหน่งเหล่านี้ไม่เหมือนกับตำแหน่งผู้เล่นที่ระบุด้านบน ตัวอย่างเช่นผู้เล่นที่อยู่ใน5ตำแหน่งจะอยู่บนเส้นทางรถไฟสำหรับอ่านซึ่งเป็นคุณสมบัติที่สามในรายการ (เนื่องจากไม่ได้เป็นเจ้าของ Go Community Chest และภาษีเงินได้) ตำแหน่งผู้เล่นวิ่งจาก0(ไป) ตามเข็มนาฬิกาไปที่39(ทางเดินริมทะเล)

การ์ด

0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;
3;12;7;4;5;2;13;11;15;6;8;9;10;1;14;-1;

แต่ละหีบโอกาสและหีบสมบัติชุมชนมี16ไพ่ทั้งหมด ตัวเลขจะปรากฏตามที่ปรากฏในสำรับสับในปัจจุบัน สำหรับตัวอย่างนี้ไพ่ใบแรกที่ดึงออกจากเด็คโอกาสจะเป็นการ์ด0ตามด้วยการ์ด1(ผู้ใดก็ตามที่สับไพ่นั้นแย่) บัตรแรกที่ดึงมาจากหน้าอกชุมชนมีบัตรแล้ว312

ไม่ต้องกังวลเกี่ยวกับสิ่งที่แต่ละบัตรหมายถึง (ข้อความการ์ด) 0ยกเว้นบัตร นั่นคือการ์ดออกจากคุกฟรีสำหรับเด็คนั้น -1หากผู้เล่นเป็นเจ้าของมันก็จะเป็นในตอนท้ายของรายการแสดงเป็น


เอาท์พุท:

คุณต้องแสดงผล (เพื่อคอนโซล stdout หรือไฟล์) เพื่อแสดงสถานะเกม ต้องมีข้อมูลทั้งหมดที่จำเป็นในการเป็นตัวแทนของเกม ตัวอย่างเช่นคุณสามารถละเว้น (หรือย่อ) คุณสมบัติที่ไม่มีกรรมสิทธิ์เนื่องจากไม่สามารถปรับปรุงหรือจำนองได้ อินพุตไม่สามารถละเว้นได้เนื่องจากเป็นรายการที่ไม่ได้ทำดัชนี

การบีบอัดควรทำในลักษณะที่คุณสามารถคำนวณขนาดผลงานที่เลวร้ายที่สุด สิ่งนี้อาจตัดสิทธิ์อัลกอริทึมการบีบอัดบางอย่าง (เว้นแต่คุณจะพิสูจน์ได้ว่าเป็นกรณีที่เลวร้ายที่สุดและให้ตัวอย่างของอินพุตที่แย่ที่สุด)

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


เกณฑ์การให้คะแนน / กฎ:

การให้คะแนนขึ้นอยู่กับขนาดการบีบอัดที่แย่ที่สุดในหน่วยบิตและขนาดซอร์สโค้ดเป็นไบต์ :

score = (outputBits * 2) + encoderSourceBytes

คำตอบที่สมบูรณ์จะต้องมี:

  • ตัวอย่างผลลัพธ์
  • แหล่งตัวเข้ารหัส
  • ตัวถอดรหัส (ไม่นับรวมกับคะแนน)

ตัวเข้ารหัสทั้งหมดต้องเป็นโปรแกรมที่สมบูรณ์และห้ามมีช่องโหว่มาตรฐาน การใช้ไลบรารีการบีบอัดในตัวหรือภายนอกยังเป็นสิ่งต้องห้าม

ผู้ชนะคือคำตอบที่มีคะแนนต่ำที่สุดตามที่กำหนดไว้ข้างต้น


หืมทำไมไม่ต้องใช้ตัวถอดรหัสรวมถึงการพิสูจน์ว่าการเข้ารหัสใช้งานได้จริง (และสามารถย้อนกลับได้)? นอกจากนี้สิ่งที่เกี่ยวกับการรวมสิ่งต่างๆเช่นการบีบอัด gzip ในตัว? นั่นจะทำให้เป็นการยากที่จะหาขนาดการบีบอัดที่แย่ที่สุด
Martin Ender

@ m.buettner แก้ไขแล้ว ฉันเพิ่มบิตเกี่ยวกับไลบรารีการบีบอัดและบิตเกี่ยวกับการพิสูจน์กรณีที่เลวร้ายที่สุด ฉันไม่ต้องการบังคับใช้ตัวถอดรหัส ผู้โพสต์สามารถรวมพวกเขาหากพวกเขาต้องการที่จะพิสูจน์วิธีการแก้ปัญหาของพวกเขา แต่มันจะไม่ถูกนับรวมกับคะแนน
Geobits

โอ้ใช่ฉันไม่ได้แนะนำให้เพิ่มลงในคะแนน คุณยังอาจต้องการตัวถอดรหัส (ungolfed) เป็นข้อพิสูจน์ ซึ่งทำให้ง่ายต่อการทดสอบว่าการส่งสามารถจัดการกรณีพิเศษหรือไม่
Martin Ender

@ m.buettner คุณสร้างจุดยอดเยี่ยม ถอดรหัสมันเป็น
Geobits

2
The second player is in jail, and has been for one turn. I'm not sure why, since he has a GOoJF card, but he's there.อยู่ในคุกเป็น lategame ที่ดีเพราะคุณไม่ได้จ่ายค่าเช่า :)
undergroundmonorail

คำตอบ:


4

(คำตอบถูกแก้ไขเมื่อเร็ว ๆ นี้ซึ่งทำให้คำถามนี้มาถึงความสนใจของฉันและฉันตัดสินใจที่จะลองแม้ว่ามันจะเป็นคำถามเก่า)

Swift 1.2 - 1,016 คะแนน (2 * 81 + 854)

ผลลัพธ์ที่เลวร้ายที่สุดคือ 81 ไบต์และเปลี่ยนแปลงตามจำนวนผู้เล่น

วิธีใดวิธีหนึ่งจากสองวิธีนี้ทำงาน เวอร์ชั่น Playground มีความยาวกว่าเล็กน้อย

บีบอัดสนามเด็กเล่น

(ถือว่าInput.txtอยู่ในPlayground Documents Directory)

// Compressor e(inputFileName, outputFileName)
import Cocoa;typealias S=String;typealias U=UInt8;func e(a:S,b:S){var d=NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)as![S],g=d[0],r=S(contentsOfFile:"\(g)/\(a)",encoding:4,error:nil)!.componentsSeparatedByString(";"),z=[U](count:4,repeatedValue:0),c=[U](),p:()->Int={r.removeAtIndex(0).toInt()!},f:()->Bool={r.removeAtIndex(0)=="true" ?true:false},j=U(p());c+=[(j<<4)|(U(p()))];for _ in 0..<j{if f(){c+=[255]}else{let(t,g,v)=(UInt16(p()),U(p()),U(p()));c+=[(U(p()))|(g<<2),v,U(t>>8),U(t&255)]}};for _ in 0..<28{c+=[(U(bitPattern:Int8(p()))<<4)|((f() ?1:0)<<3)|(U(p()))]};for h in 0..<16{let y=h>7 ?1:0,x=Int8(p()),w=Int8(p());c+=[(U(bitPattern:x)<<4)|(U(bitPattern:w)&15)];z[y]=z[y]<<1;if x == -1{z[y]|=1};z[y+1]=z[y+1]<<1;if w == -1{z[y+1]|=1}};NSData(bytes:c+z,length:c.count+4).writeToFile("\(g)/\(b)",atomically:true)}

// Decompressor d(inputFileName, outputFileName)
func d(a:S,b:S){var d = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)as![String],e=d[0],i=NSData(contentsOfFile:"\(e)/\(a)")!,n=[UInt8](count:i.length,repeatedValue:0),o="";i.getBytes(&n,length:i.length);let k=n.removeAtIndex(0),j=k>>4;o+="\(j);\(k&15);";for _ in 0..<j{let h=n.removeAtIndex(0);if h>>7 == 1{o+="true;";continue};let p=n.removeAtIndex(0),b=n.removeAtIndex(0),c=n.removeAtIndex(0);o+="false;\(UInt16(b)<<8|UInt16(c));\(h>>2);\(p);\(h&0b11);"};for _ in 0..<28{let p=Int8(bitPattern:n.removeAtIndex(0)),mortgage=((p>>3)&1)==1 ?"true":"false";o+="\(p>>4);\(mortgage);\(p&7);"};var m=[U](count:4,repeatedValue:0);for i in reverse(0..<4){m[i]=n.removeLast()};for h in 0..<16{var i=h>7 ?1:0,z=n.removeAtIndex(0),x=Int8(z>>4),y=Int8(z&15),isUnowned1=m[i]&128;m[i]=m[i]<<1;let isUnowned2=m[i+1]&128;m[i+1]=m[i+1]<<1;if isUnowned1 != 0 {x=(-1)};if isUnowned2 != 0 {y=(-1)};o+="\(x);\(y);"};o.writeToFile("\(e)/\(b)",atomically:true,encoding:4,error:nil)}

// Test function to compare the files
func t(a:S,b:S)->Bool{let d=NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)as![String],c=d[0],i=S(contentsOfFile:"\(c)/\(a)",encoding:4,error:nil)!,j=S(contentsOfFile:"\(c)/\(b)",encoding:4,error:nil)!;return i==j}
// Usage
e("Input.txt", "Output.bin")  // Encode
d("Output.bin", "Output.txt") // Decode
t("Input.txt", "Output.txt")  // Test -> Should output 'true'

Compress.swift - ทำงานใน Terminal โดยใช้swift Compress.swift

(สมมติว่าInput.txtเป็นบนDesktop)

// Compressor - 854 Bytes
import Cocoa;typealias S=String;typealias U=UInt8;func e(a:S,b:S){var d=NSSearchPathForDirectoriesInDomains(.DesktopDirectory,.UserDomainMask, true)as![S],g=d[0],r=S(contentsOfFile:"\(g)/\(a)",encoding:4,error:nil)!.componentsSeparatedByString(";"),z=[U](count:4,repeatedValue:0),c=[U](),p:()->Int={r.removeAtIndex(0).toInt()!},f:()->Bool={r.removeAtIndex(0)=="true" ?true:false},j=U(p());c+=[(j<<4)|(U(p()))];for _ in 0..<j{if f(){c+=[255]}else{let(t,g,v)=(UInt16(p()),U(p()),U(p()));c+=[(U(p()))|(g<<2),v,U(t>>8),U(t&255)]}};for _ in 0..<28{c+=[(U(bitPattern:Int8(p()))<<4)|((f() ?1:0)<<3)|(U(p()))]};for h in 0..<16{let y=h>7 ?1:0,x=Int8(p()),w=Int8(p());c+=[(U(bitPattern:x)<<4)|(U(bitPattern:w)&15)];z[y]=z[y]<<1;if x == -1{z[y]|=1};z[y+1]=z[y+1]<<1;if w == -1{z[y+1]|=1}};NSData(bytes:c+z,length:c.count+4).writeToFile("\(g)/\(b)",atomically:true)}
// Decompressor
func d(a:S,b:S){var d = NSSearchPathForDirectoriesInDomains(.DesktopDirectory,.UserDomainMask,true)as![String],e=d[0],i=NSData(contentsOfFile:"\(e)/\(a)")!,n=[UInt8](count:i.length,repeatedValue:0),o="";i.getBytes(&n,length:i.length);let k=n.removeAtIndex(0),j=k>>4;o+="\(j);\(k&15);";for _ in 0..<j{let h=n.removeAtIndex(0);if h>>7 == 1{o+="true;";continue};let p=n.removeAtIndex(0),b=n.removeAtIndex(0),c=n.removeAtIndex(0);o+="false;\(UInt16(b)<<8|UInt16(c));\(h>>2);\(p);\(h&0b11);"};for _ in 0..<28{let p=Int8(bitPattern:n.removeAtIndex(0)),mortgage=((p>>3)&1)==1 ?"true":"false";o+="\(p>>4);\(mortgage);\(p&7);"};var m=[U](count:4,repeatedValue:0);for i in reverse(0..<4){m[i]=n.removeLast()};for h in 0..<16{var i=h>7 ?1:0,z=n.removeAtIndex(0),x=Int8(z>>4),y=Int8(z&15),isUnowned1=m[i]&128;m[i]=m[i]<<1;let isUnowned2=m[i+1]&128;m[i+1]=m[i+1]<<1;if isUnowned1 != 0 {x=(-1)};if isUnowned2 != 0 {y=(-1)};o+="\(x);\(y);"};o.writeToFile("\(e)/\(b)",atomically:true,encoding:4,error:nil)}
func t(a:S,b:S)->Bool{let d=NSSearchPathForDirectoriesInDomains(.DesktopDirectory,.UserDomainMask,true)as![String],c=d[0],i=S(contentsOfFile:"\(c)/\(a)",encoding:4,error:nil)!,j=S(contentsOfFile:"\(c)/\(b)",encoding:4,error:nil)!;return i==j}
e("Input.txt", "Output.bin")
d("Output.bin", "Output.txt")
println(t("Input.txt", "Output.txt"))

ตัวอย่างอินพุต / เอาต์พุต

3;1;false;1534;0;14;0;false;34;1;10;1;true;1;false;1;1;false;0;0;true;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;3;12;6;9;4;-1;4;8;4;2;9;5;11;10;14;7;

.

31 00 0E 05 FE 05 0A 00 22 FF 11 10 08 F0 F0 F0
F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 
F0 F0 F0 F0 F0 F0 01 23 45 67 89 AB CD EF 3C 69 
4F 48 42 95 BA E7 00 00 20 00

4

Pure C (3592 คะแนน)

ผลลัพธ์คือ 182 ไบต์ ขนาดคือ O (1) ดังนั้นนี่เป็นกรณีที่เลวร้ายที่สุด

สิ่งนี้ใช้ sscanf อย่างกว้างขวางเพื่ออ่านไฟล์และเพียงแค่ทิ้ง structs ไปยังดิสก์

ฉันต้องแก้ไขอินพุตเล็กน้อยเนื่องจากตัวอย่างของคุณไม่มีคุณสมบัติ 28 อย่าง

สำหรับตัวแปรฉันตั้งชื่อพวกเขาจากตัวอักษรตัวแรกของสิ่งที่มันเป็นหรือถ้ามันจะขัดแย้งตัวอักษรตัวที่สอง (หรือต่อมา) ตัวอย่างเช่นเกม, pLayer, pRoperty เป็นต้น

compress.c (680 ไบต์):

#import <stdio.h>
#import <stdint.h>
#define T(X) for(int i=0;i<(X);i++)
typedef uint8_t U;typedef struct{U p;U t;U a[16];U e[16];}G;typedef struct{U b;uint16_t m;U c;U p;U t;}L;typedef struct{int8_t o;U m;U i;}R;G g;L l[8];R r[28];main(){FILE *f=fopen("input.txt","r");fscanf(f,"%d;%d;",&g.p,&g.t);T(g.p){l[i].b=(fgetc(f)=='t');while(fgetc(f)!=';');if(!l[i].b){fscanf(f,"%d;%d;%d;%d;",&l[i].m,&l[i].c,&l[i].p,&l[i].t);}}T(28){fscanf(f,"%d;",&r[i].o);r[i].m=(fgetc(f)=='t');while(fgetc(f)!=';');fscanf(f,"%d;",&r[i].i);}T(16){fscanf(f,"%d;",&g.a[i]);}T(16){fscanf(f,"%d;",&g.e[i]);}f=fopen("c.dat","w");fwrite(&g,sizeof(G),1,f);fwrite(&l,sizeof(L),8,f);fwrite(&r,sizeof(R),28,f);}

compress.c (ก่อนเล่นกอล์ฟ)

#include "m.h"

#define NEXT_FIELD b=strchr(b,';')+1;

G g;
L l[8];
R r[28];

char a[1024];
char *b = a;

main() {
    FILE *i = fopen("input.txt", "r");
    fgets(a, 1024, i);
    fclose(i);

    sscanf(b, "%d;%d;", &g.p, &g.t);
    NEXT_FIELD NEXT_FIELD

    TIMES(g.p) {
        l[i].b = (*b == 't'); NEXT_FIELD
        if(!l[i].b) {
            sscanf(b, "%d;%d;%d;%d;", &l[i].m, &l[i].c, &l[i].p, &l[i].t);
            NEXT_FIELD NEXT_FIELD NEXT_FIELD NEXT_FIELD
        }
    }

    TIMES(28) {
        sscanf(b, "%d;", &r[i].o); NEXT_FIELD
        r[i].m = (*b == 't'); NEXT_FIELD
        sscanf(b, "%d;", &r[i].i); NEXT_FIELD
    }

    TIMES(16) {
        sscanf(b, "%d", &g.a[i]);
        NEXT_FIELD
    }

    TIMES(16) {
        sscanf(b, "%d", &g.e[i]);
        NEXT_FIELD
    }

    FILE *c = fopen("c.dat", "w");
    fwrite(&g, sizeof(G), 1, c);
    fwrite(&l, sizeof(L), 8, c);
    fwrite(&r, sizeof(R), 28, c);
    fclose(c);
}

decompress.c :

#import <stdio.h>
#import <stdint.h>

#define T(X) for(int i = 0; i < (X); i++)
typedef uint8_t U;

typedef struct {
    U p;
    U t;
    U a[16];
    U e[16];
} G;
typedef struct {
    U b;
    uint16_t m;
    U c;
    U p;
    U t;
} L;
typedef struct {
    int8_t o;
    U m;
    U i;
} R;

G g;
L l[8];
R r[28];

main() {
    FILE *c = fopen("c.dat", "r");
    fread(&g, sizeof(G), 1, c);
    fread(&l, sizeof(L), 8, c);
    fread(&r, sizeof(R), 28, c);
    fclose(c);

    FILE *d = fopen("output.txt", "w");

    fprintf(d, "%d;%d;", g.p, g.t);
    T(g.p) {
        fprintf(d, "%s;", l[i].b ? "true" : "false");
        if(!l[i].b){
            fprintf(d, "%d;%d;%d;%d;", l[i].m, l[i].c, l[i].p, l[i].t);
        }
    }
    T(28) {
        fprintf(d, "%d;%s;%d;", r[i].o, r[i].m ? "true" : "false", r[i].i);
    }
    T(16) { fprintf(d, "%d;", g.a[i] != 255 ? g.a[i] : -1); }
    T(16) { fprintf(d, "%d;", g.e[i] != 255 ? g.e[i] : -1); }

    fclose(d);
}

อินพุต / เอาต์พุต :

3;1;false;1546;0;14;0;false;7692;1;10;1;true;1;false;1;1;false;0;0;true;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;-1;false;0;0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;3;12;7;4;5;2;13;11;15;6;8;9;10;1;14;-1;

บีบอัด (182 ไบต์):

0301 0001 0203 0405 0607 0809 0a0b 0c0d
0e0f 030c 0704 0502 0d0b 0f06 0809 0a01
0eff 0000 0a06 000e 0000 0000 0c1e 010a
0100 0100 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0100 0101 0000 0001 00ff 0000 ff00
00ff 0000 ff00 00ff 0000 ff00 00ff 0000
ff00 00ff 0000 ff00 00ff 0000 ff00 00ff
0000 ff00 00ff 0000 ff00 00ff 0000 ff00
00ff 0000 ff00 00ff 0000 ff00 00ff 0000
ff00 00ff 0000 

เรียกใช้!

$ make compress decompress && ./compress && ./decompress && md5 input.txt output.txt
MD5 (input.txt) = fa655a5a17d67b188424ab0dcfdfb825
MD5 (output.txt) = fa655a5a17d67b188424ab0dcfdfb825

ขอบคุณฉันรีดส่วนหัวเพื่อบันทึกเล็กน้อยและแก้ไขคะแนนของฉันให้นับไบต์
wjl

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