একচেটিয়া সংকোচনের


17

কোনও খেলোয়াড়ের পালা শুরুর শুরুতে একচেটিয়া গেমের বর্তমান অবস্থার প্রতিনিধিত্ব করে একটি স্ট্রিং দেওয়া , সমস্ত প্রয়োজনীয় তথ্যকে ছোট আউটপুটে সংকুচিত করে। উত্তরগুলি আউটপুট আকার এবং উত্সের আকার দ্বারা বিচার করা হবে ।

দ্রষ্টব্য: এখানে অনেক আঞ্চলিক প্রকরণ রয়েছে, তবে সম্পত্তি সম্পর্কিত নাম ইত্যাদির জন্য এই পোস্টে সমস্ত উল্লেখ এই বোর্ডের উপর ভিত্তি করে ।


ইনপুট:

ইনপুটটি একক ;পৃথক পৃথক স্ট্রিং হিসাবে দেওয়া হবে । এই স্ট্রিংটি আপনার নির্বাচিত ভাষায় যেভাবেই রীতিগতভাবে প্রথাগত তা প্রোগ্রামকে দেওয়া হয়, এটি স্টিডিন, আর্গুমেন্ট ইত্যাদি whether

ফর্ম্যাট করা ইনপুটটি দেখতে এমন দেখাচ্ছে:

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 (ভার্জিনিয়া এভে)
  • কারাগারে নেই

দ্বিতীয় খেলোয়াড় হয় জেলে, এবং পালা জন্য করা হয়েছে। কেন আমি নিশ্চিত নই , যেহেতু তার একটি জিওজেএফ কার্ড রয়েছে তবে সে সেখানে আছে।

তৃতীয় প্লেয়ার দেউলিয়ার, এবং আরও তথ্যের প্রয়োজন হয় না বা দেওয়া হয় না।

প্রোপার্টি

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

ভূমধ্যসাগর থেকে শুরু করে বোর্ডওয়াকের সমাপ্তি করে বোর্ডের চারপাশে সম্পত্তিগুলি তালিকাভুক্ত করা হয়। যে সম্পত্তিগুলি মালিকানাধীন হতে পারে সেগুলি এই তালিকায় অন্তর্ভুক্ত নয়, সুতরাং মোট ২৮ টি থাকবে Imp উন্নতি স্তরটির 0অর্থ অসমর্থিত। স্তরের 1একটি বাড়ি, 5হোটেলের জন্য স্তর পর্যন্ত । একজন -1মালিক মানে জন্য এটি কোনো খেলোয়াড় মালিকানাধীন নয়।

স্ট্যান্ডার্ড নিয়ম অনুসারে, বন্ধকযুক্ত একটি সম্পত্তি অবশ্যই মালিকানাধীন হতে হবে এবং উন্নত করা উচিত নয় । উন্নত একটি সম্পত্তি অবশ্যই মালিকানাধীন এবং বন্ধকী হওয়া উচিত নয়

তদুপরি, সম্পত্তি উন্নত করার জন্য, খেলোয়াড়ের অবশ্যই পুরো রঙের ব্লকটির মালিক হতে হবে । এই গেমের উদ্দেশ্যে, সম্পত্তিগুলিকে "সমানভাবে" উন্নত করা হচ্ছে কিনা তা আমরা বিবেচনা করি না।

মনে রাখবেন যে এই অবস্থানগুলি উপরে বর্ণিত প্লেয়ার পজিশনের মতো নয় । উদাহরণস্বরূপ, 5পজিশনের একজন প্লেয়ার রিডিং রেলরোডে থাকবে, যা তালিকার তৃতীয় সম্পত্তি (যেহেতু গো, সম্প্রদায় বুকে এবং আয়কর মালিক হতে পারে না)। খেলোয়াড়ের অবস্থানগুলি 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(যে কেউ এই ডেকটি সাফ করে দেয় )। কমিউনিটি বুক থেকে টানা প্রথম কার্ড কার্ড 3, তারপর 12

কার্ড ব্যতীত প্রতিটি কার্ডের অর্থ (কার্ডের পাঠ্য) কী তা নিয়ে চিন্তা করবেন না 0। এটি সেই ডেকের জেল আউট অফ জেল ফ্রি কার্ড। কোনও খেলোয়াড় যদি এর মালিক হন, তবে তালিকাটির শেষে এটি প্রদর্শিত হবে -1


আউটপুট:

আপনাকে গেমের অবস্থার একটি প্রতিনিধিত্ব করতে হবে (কনসোল, স্টডআউট বা ফাইল করতে)। এটি অবশ্যই গেম উপস্থাপনের জন্য প্রয়োজনীয় সমস্ত তথ্য অন্তর্ভুক্ত করতে হবে । উদাহরণস্বরূপ, আপনি অবিকৃত বৈশিষ্ট্যগুলি বাদ দিতে (বা সংক্ষেপণ) করতে পারেন, যেহেতু সেগুলির কোনও উন্নতি বা বন্ধক রাখা যায় না। ইনপুট এগুলি বাদ দিতে পারে না কারণ এটি একটি আনইনডেক্সের তালিকা।

সংক্ষিপ্তকরণটি এমনভাবে করা উচিত যাতে আপনি খারাপের ক্ষেত্রে আউটপুট আকারের গণনা করতে পারেন। এটি নির্দিষ্ট সংক্ষেপণ অ্যালগরিদমকে অযোগ্য ঘোষণা করতে পারে (যদি না আপনি সবচেয়ে খারাপ ক্ষেত্রেটি প্রমাণ করতে পারেন এবং সবচেয়ে খারাপ ক্ষেত্রে ইনপুটটির উদাহরণ না দিয়ে থাকেন)।

যদি আপনার উত্স কোডটি অযৌক্তিকভাবে ভার্বোজ না করে, গেমটি কীভাবে উপস্থাপিত হয় তার একটি ব্যাখ্যা দিন। একটি গল্ফযুক্ত প্রোগ্রাম এবং সংকুচিত আউটপুট ব্যতীত অন্য কিছু সহ উত্তরগুলি নিরুৎসাহিত করা হয়। উদাহরণস্বরূপ, আপনি যদি কিছু মান বাদ দিচ্ছেন তবে আউটপুট থেকে কীভাবে তাদের প্রাপ্ত করা সম্ভব তা ব্যাখ্যা করুন।


স্কোরিং / নিয়মাবলী:

স্কোরিং উভয় উপর ভিত্তি করে তৈরি খারাপ-কেস মধ্যে কম্প্রেশন আকার বিট , এবং সোর্স কোড আকার বাইট :

score = (outputBits * 2) + encoderSourceBytes

একটি সম্পূর্ণ উত্তরে অবশ্যই অন্তর্ভুক্ত থাকতে হবে:

  • আউটপুট উদাহরণ
  • এনকোডার উত্স
  • ডিকোডার উত্স (স্কোরের বিপরীতে গণনা করা হয়নি)

সমস্ত এনকোডার অবশ্যই সম্পূর্ণ প্রোগ্রাম হতে হবে এবং মানক লুফোলগুলি নিষিদ্ধ। অন্তর্নির্মিত বা বাহ্যিক সংক্ষেপণ গ্রন্থাগারগুলি ব্যবহার নিষিদ্ধ।

উপরের সংজ্ঞায়িত হিসাবে বিজয়ী সর্বনিম্ন স্কোর সহ উত্তর ।


হুঁ, এনকোডিংটি আসলে কাজ করে (এবং পুনরায় পরিবর্তনযোগ্য) কেন একটি প্রমাণীকরণের পাশাপাশি ডিকোডার প্রয়োজন হয় না? এছাড়াও অন্তর্নির্মিত জিজিপ সংকোচনের মতো স্টাফ অন্তর্ভুক্ত সম্পর্কে কী? এটি সবচেয়ে খারাপ ক্ষেত্রে সংকোচনের আকার বের করা সত্যিই কঠিন করে তুলবে।
মার্টিন ইন্ডার

@ এম.বুয়েটনার সম্পাদিত। আমি কম্প্রেশন লাইব্রেরি সম্পর্কে কিছুটা যুক্ত করেছি, এবং সবচেয়ে খারাপের প্রমাণের জন্যও। আমি সত্যিই কোনও ডিকোডার প্রয়োগ করতে চাই না। পোস্টারগুলি তাদের সমাধানটি প্রমাণ করতে চাইলে সেগুলি অন্তর্ভুক্ত করতে পারে তবে এটি স্কোরের তুলনায় গণ্য হবে না।
Geobits

ওহ হ্যাঁ, আমি তাদের স্কোরগুলিতে যুক্ত করার পরামর্শ দিচ্ছিলাম না। প্রমাণের জন্য আপনার এখনও একটি (অবরুদ্ধ) ডিকোডারের প্রয়োজন হতে পারে। এটি জমা দেওয়া বিশেষ কেসগুলি পরিচালনা করতে পারে কিনা তা পরীক্ষা করা সহজ করে তোলে।
মার্টিন ইন্ডার

@ m.buettner আপনি একটি দুর্দান্ত পয়েন্ট করেছেন। এটি ডিকোডার্স।
জিওবিটস

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.জেল থাকা ভাল লেটগেম কারণ আপনি ভাড়া দিচ্ছেন না। :)
আন্ডারগ্রাউন্ডোমোনাইল

উত্তর:


4

(সম্প্রতি একটি উত্তর সম্পাদনা করা হয়েছিল, যা এই প্রশ্নটি আমার নজরে এনেছে এবং আমি সিদ্ধান্ত নিয়েছি এটি পুরানো প্রশ্ন হলেও চেষ্টা করার চেষ্টা করব।)

সুইফট 1.2 - 1016 পয়েন্ট (2 * 81 + 854)

আউটপুটটি সবচেয়ে খারাপ 81 বাইটে এবং খেলোয়াড়ের পরিমাণের সাথে পরিবর্তন হয়।

দুটি পদ্ধতির একটিতেও কাজ করে। প্লেগ্রাউন্ড সংস্করণটি কিছুটা দীর্ঘ।

খেলার মাঠ সংকুচিত করুন

( 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 - টার্মিনাল ব্যবহার করে চালান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

খাঁটি সি (3592 পয়েন্ট)

আউটপুট 182 বাইট। আকারটি ও (1), সুতরাং এটি সবচেয়ে খারাপ ক্ষেত্রে।

ফাইলগুলি পড়ার জন্য এটি স্ক্যানফ ব্যবহার করে এবং স্ট্র্টগুলি কেবল ডিস্কে ফেলে দেয়।

আমাকে সামান্য ইনপুটটি সংশোধন করতে হয়েছিল, কারণ আপনার উদাহরণে ২৮ টি বৈশিষ্ট্য অন্তর্ভুক্ত নেই।

ভেরিয়েবলের জন্য, আমি তাদের নামটি দিয়েছি এটি প্রথম অক্ষরটি থেকে কী, অথবা যদি এটির বিরোধ হয় তবে দ্বিতীয় (বা পরবর্তী) চিঠিটি। উদাহরণস্বরূপ, গেম, পি লেয়ার, পি রোপার্টি ইত্যাদি

কমপ্রেস.সি (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);}

কম্প্রেস.সি (প্রাক-গল্ফযুক্ত)

#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

দেখে মনে হচ্ছে আপনি পরে রান-লেংথ এনকোডিং সহ কিছু বাইট সংরক্ষণ করতে পারেন। এটি কতটা সম্ভব তা নিশ্চিত না তবে আপনি যদি এটি একটি এস্কেপ বাইটের মাধ্যমে করেন তবে এটি অ-পুনরাবৃত্ত ডেটা দিয়েও ভাল করা উচিত। হেহ।
সিজেফুরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.