কে একজন কোলমোগোরভ জটিলতার বিজয়ী হতে চান?


22

আপনার মিশনটি আজ একটি পাঠ্য সংক্ষেপক উদ্ভাবন করা।

কার্য

আপনি দুটি ফাংশন লিখবেন:

  • প্যাকার একটি ফাংশন যে ASCII অক্ষর (ইউ + + 0000 U + এ 007F) এর একটি স্ট্রিং গ্রহণ এবং একটি ইউনিকোড স্ট্রিং (ইউ + + 0000 U + এ 10FFFF করার জন্য) আউটপুট, সম্ভব অল্পসংখ্যক পরিষেবা অক্ষর রয়েছে।

  • Unpacker একটি ফাংশন যে একটি এনকোড ইউনিকোড স্ট্রিং গ্রহণ করে এবং ঠিক মূল হওয়া ASCII স্ট্রিং আউটপুট হয়।

ইনপুট

একমাত্র অনুমোদিত ইনপুট হ'ল ASCII স্ট্রিং (প্যাকারের জন্য) এবং প্যাকযুক্ত ইউনিকোড স্ট্রিং (আনপ্যাকারের জন্য)। কোনও ব্যবহারকারী ইনপুট নয়, কোনও ইন্টারনেট সংযোগ নেই, ফাইল সিস্টেমের ব্যবহার নেই।

আপনার ফাংশনগুলিতে ইংরেজি শব্দের এই তালিকায় অ্যাক্সেস থাকতে পারে । আপনি স্থানীয় তালিকার ফাইল হিসাবে এই তালিকাটি ব্যবহার করতে পারেন, বা স্ট্রিং বা স্ট্রিংগুলির একটি অ্যারে হিসাবে আপনার উত্স কোডে এর বিষয়বস্তু অনুলিপি করতে পারেন ।

আপনি নিজের ফাংশনে নীচে স্নিপেটগুলি হার্ডকোড করতে পারবেন না।

আউটপুট

উভয় ফাংশনের জন্য শুধুমাত্র অনুমোদিত আউটপুট একটি স্ট্রিং।

আনপ্যাকারের আউটপুটটিতে অবশ্যই প্যাকারের ইনপুটের মতো একই অক্ষর থাকতে হবে।

আপনার ইনপুট এবং আউটপুটগুলি সমস্ত ইউনিকোড (ইউটিএফ -8 / 16/32, জিবি 18030, ...) সমর্থন করে যে কোনও অক্ষর এনকোডিং ব্যবহার করতে পারে, কারণ আপনার স্কোর কেবল আউটপুটে ইউনিকোড অক্ষরের সংখ্যার উপর নির্ভর করবে। আপনি কোন এনকোডিংটি ব্যবহার করছেন তা দয়া করে নিশ্চিত করুন।

আপনার আউটপুটে ইউনিকোড অক্ষরের সংখ্যা গণনা করতে, আপনি এই সরঞ্জামটি ব্যবহার করতে পারেন: http://mothereff.in/byte-counter

স্কোরিং

আপনার এন্ট্রি অবশ্যই নিম্নলিখিত 10 টি পাঠ্য স্নিপেটগুলি প্যাক করতে এবং আনপ্যাক করতে সক্ষম হবে (যা আমি এই ফোরামটিতে নিয়েছি)।

আপনার স্কোরটি আপনার 10 টি প্যাকযুক্ত স্ট্রিংগুলির আকার (ইউনিকোড অক্ষরগুলিতে) + আপনার দুটি ফাংশনের আকার (ইউনিকোড অক্ষরগুলিতেও) হবে

আপনি যদি এটি ব্যবহার করেন তবে ডিকশনারিটির আকারটি গণনা করবেন না।

দয়া করে আপনার এন্ট্রিগুলিতে প্রতিটি স্নিপেট এবং তাদের প্যাক করা সংস্করণটির "স্কোর" অন্তর্ভুক্ত করুন।

সর্বনিম্ন স্কোর জয়।

উপাত্ত

আপনার স্কোর গণনা করতে এনকোড করার জন্য এখানে স্নিপেটগুলি রয়েছে:

1: রিক রোলের গানের কথা (1870b): আমরা গল্ফ কোড দেওয়ার জন্য কোনও অপরিচিত নই, আপনি নিয়মগুলি জানেন এবং আমিও তাই করি

আমরা প্রেম করার জন্য অপরিচিত কেউ নই
আপনি নিয়ম জানেন এবং আমিও
একটি পূর্ণ প্রতিশ্রুতিবদ্ধ যা আমি ভাবছি
আপনি এটি অন্য কোনও লোকের কাছ থেকে পাবেন না
আমি শুধু আপনাকে কেমন বোধ করছি তা বলতে চাই
আপনাকে বোঝাতে হবে

তোমাকে ছেড়ে দেবে না
তোমাকে কখনই হতাশ করবে না
কখনও দৌড়াতে হবে না এবং আপনাকে ত্যাগ করবে না
তোমাকে কখনই কাঁদতে দেবে না
কখনও বিদায় জানাতে হবে না
কখনই কোন মিথ্যা বলবে না এবং তোমাকে আঘাত করবে না

আমরা একে অপরকে এত দিন ধরে চিনি
আপনার হৃদয় ব্যথা হয়েছে কিন্তু
আপনি এটি বলতে খুব লজ্জা পান
ভিতরে আমরা দুজনেই জানি যা চলছে
আমরা খেলাটি জানি এবং আমরা এটি খেলব
এবং আপনি যদি আমাকে জিজ্ঞাসা করেন আমি কেমন অনুভব করছি
আমাকে বলবেন না আপনি দেখতে খুব অন্ধ

তোমাকে ছেড়ে দেবে না
তোমাকে কখনই হতাশ করবে না
কখনও দৌড়াতে হবে না এবং আপনাকে ত্যাগ করবে না
তোমাকে কখনই কাঁদতে দেবে না
কখনও বিদায় জানাতে হবে না
কখনই কোন মিথ্যা বলবে না এবং তোমাকে আঘাত করবে না

তোমাকে ছেড়ে দেবে না
তোমাকে কখনই হতাশ করবে না
কখনও দৌড়াতে হবে না এবং আপনাকে ত্যাগ করবে না
তোমাকে কখনই কাঁদতে দেবে না
কখনও বিদায় জানাতে হবে না
কখনই কোন মিথ্যা বলবে না এবং তোমাকে আঘাত করবে না

(ওহ, আপনাকে ছেড়ে দিন)
(ওহ, আপনাকে ছেড়ে দিন)
(ওহ)
কখনই দেবে না, কখনই দেবে না
(বরজন কর)
(ওহ)
কখনই দেবে না, কখনই দেবে না
(বরজন কর)

আমরা একে অপরকে এত দিন ধরে চিনি
আপনার হৃদয় ব্যথা হয়েছে কিন্তু
আপনি এটি বলতে খুব লজ্জা পান
ভিতরে আমরা দুজনেই জানি যা চলছে
আমরা খেলাটি জানি এবং আমরা এটি খেলব

আমি শুধু আপনাকে কেমন বোধ করছি তা বলতে চাই
আপনাকে বোঝাতে হবে

তোমাকে ছেড়ে দেবে না
তোমাকে কখনই হতাশ করবে না
কখনও দৌড়াতে হবে না এবং আপনাকে ত্যাগ করবে না
তোমাকে কখনই কাঁদতে দেবে না
কখনও বিদায় জানাতে হবে না
কখনই কোন মিথ্যা বলবে না এবং তোমাকে আঘাত করবে না

তোমাকে ছেড়ে দেবে না
তোমাকে কখনই হতাশ করবে না
কখনও দৌড়াতে হবে না এবং আপনাকে ত্যাগ করবে না
তোমাকে কখনই কাঁদতে দেবে না
কখনও বিদায় জানাতে হবে না
কখনই কোন মিথ্যা বলবে না এবং তোমাকে আঘাত করবে না

তোমাকে ছেড়ে দেবে না
তোমাকে কখনই হতাশ করবে না
কখনও দৌড়াতে হবে না এবং আপনাকে ত্যাগ করবে না
তোমাকে কখনই কাঁদতে দেবে না
কখনও বিদায় জানাতে হবে না
কখনই কোন মিথ্যা বলবে না এবং তোমাকে আঘাত করবে না

2: গল্ফার (412 বি): গল্ফিং ASCII- আর্ট

      '\। । |> 18 >>
        । '। |
       ও >> 'ও |
        । |
        /। |
       / / ' |
 jgs ^^^^^^^ `^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^

3: নম্বর হীরা (233 বি): এই হীরাটি মুদ্রণ করুন

        1
       121
      12321
     1234321
    123454321
   12345654321
  1234567654321
 123456787654321
12345678987654321
 123456787654321
  1234567654321
   12345654321
    123454321
     1234321
      12321
       121
        1

4: বর্ণমালাটি চারবার (107 বি): বর্ণমালাটি চারবার মুদ্রণ করুন

ABCDEFGHIJKLMNOPQRSTUVWXYZ
qwertyuiopasdfghjklzxcvbnm
pyfgcrlaoeuidhtnsqjkxbmwvz
zyxwvutsrqponmlkjihgfedcba

5: ওল্ড ম্যাকডোনাল্ডের লিরিক্স (203 বি): ওল্ড ম্যাকডোনাল্ড ফাংশন

ওল্ড ম্যাকডোনাল্ডের একটি খামার ছিল, EIEIO,
এবং সেই খামারে তার একটি গরু ছিল, EIEIO,
এখানে একটি মু মু এবং সেখানে একটি মু মু
এখানে একটি মু, সেখানে একটি মু, সর্বত্র একটি মু মু,
ওল্ড ম্যাকডোনাল্ডের একটি ফার্ম ছিল, EIEIO!

6: রক প্রায় ঘড়ি কথা (144b): রক ঘড়ি কাছাকাছি

1, 2, 3 pm, 4 pm শৈল,
5, 6, 7 টা, 8 টায় রক,
9, 10, 11 pm, 12 টা বাজির শিলা,
আমরা আজ রাত্রে ঘড়ির কাঁটা ধরে আছি।

7: হ্যালো ওয়ার্ল্ড (296 বি): ASCII শিল্পে বিশ্বকে "হ্যালো" বলুন

 _ _ _ _ _ _ _ _
| | | | ___ | | | ___ __ _____ _ __ | | | __ | | |
| |: _ | | / _ \ | | / _ \ \ \ / \ / / _ \ | '__ | | / _` | |
| _ | __ / | | (_) | । ভিভি / (_) | | | | (_ | | _ | |
|: _ | | _ | \ ___ | _ | _ | \ ___ () \ _ / \ _ / \ ___ / | _ | |: _ | \ __,: _ (_)
                    | /

8: আইরিশ আশীর্বাদ (210 বি): একটি পুরানো আইরিশ আশীর্বাদ

রাস্তাটি আপনার সাথে দেখা করতে উঠুক
বায়ু আপনার পিছে সবসময় হতে পারে
আপনার মুখের উপর সূর্য উজ্জ্বল হোক
বৃষ্টি আপনার জমিতে নরম পড়েছে
এবং আমরা আবার দেখা পর্যন্ত
Youশ্বর আপনাকে তাঁর হাতের ফাঁকে ধরে রাখুন

9: একটি পুরানো মহিলা গানের কথা ছিল (1208b): ওল্ড ওল্ডি ছিল

সেখানে এক বৃদ্ধা মহিলা ছিলেন যারা একটি মাছি গিলেছিলেন।  
আমি জানি না কেন সে উড়ালটি গ্রাস করেছিল,  
সম্ভবত সে মারা যাবে।

সেখানে একজন বৃদ্ধ মহিলা ছিলেন যিনি একটি মাকড়সা গিলেছিলেন,  
এই শিহরিত এবং হিমশীতল এবং তার ভিতরে jiggled।  
উড়ালটি ধরতে সে মাকড়সা গিলেছিল,  
আমি জানি না কেন সে উড়ালটি গ্রাস করেছিল,  
সম্ভবত সে মারা যাবে।

সেখানে একজন বৃদ্ধ মহিলা ছিলেন যারা পাখি গিলেছিলেন,  
পাখি গিলে ফেলা কতটা বেয়াদবি।  
মাকড়সাটি ধরতে সে পাখিটি গ্রাস করেছিল,  
উড়ালটি ধরতে সে মাকড়সা গিলেছিল,  
আমি জানি না কেন সে উড়ালটি গ্রাস করেছিল,  
সম্ভবত সে মারা যাবে।

সেখানে একজন বৃদ্ধ মহিলা ছিলেন যারা একটি বিড়াল গিলেছিলেন,  
কল্পনা করুন যে একটি বিড়াল গিলতে।  
পাখিটি ধরতে সে বিড়ালটিকে গ্রাস করেছিল,  
মাকড়সাটি ধরতে সে পাখিটি গ্রাস করেছিল,  
উড়ালটি ধরতে সে মাকড়সা গিলেছিল,  
আমি জানি না কেন সে উড়ালটি গ্রাস করেছিল,  
সম্ভবত সে মারা যাবে।

সেখানে একজন বৃদ্ধ মহিলা ছিলেন যারা কুকুর গিলেছিলেন,  
কুকুরকে গিলে ফেলার কী হোগ।  
বিড়ালটিকে ধরতে সে কুকুরটিকে গ্রাস করেছিল,  
পাখিটি ধরতে সে বিড়ালটিকে গ্রাস করেছিল,  
মাকড়সাটি ধরতে সে পাখিটি গ্রাস করেছিল,  
উড়ালটি ধরতে সে মাকড়সা গিলেছিল,  
আমি জানি না কেন সে উড়ালটি গ্রাস করেছিল,  
সম্ভবত সে মারা যাবে।

সেখানে এক বৃদ্ধ মহিলা ছিল যে একটি ঘোড়া গিলেছিল,  
তিনি অবশ্যই মারা গেলেন।

10: গেটসবার্গের ঠিকানা (1452 বি): গেটটিসবার্গের ঠিকানাটি কতটা এলোমেলো

চারটি স্কোর এবং সাত বছর আগে আমাদের পিতৃপুরুষরা এই মহাদেশে একটি নতুন জাতি জন্ম নিয়েছিল, স্বাধীনতায় গর্ভে ধারণ করেছিল এবং এই প্রস্তাব উত্সর্গ করেছিল যে সমস্ত পুরুষকে সমানভাবে সৃষ্টি করা হয়েছে। এখন আমরা একটি মহান গৃহযুদ্ধে লিপ্ত হয়েছি, সেই জাতি, বা কোনও জাতি এতটা কল্পনা এবং এতটাই নিবেদিত, দীর্ঘকাল সহ্য করতে পারে কিনা তা পরীক্ষা করে। আমাদের সেই যুদ্ধের দুর্দান্ত এক যুদ্ধক্ষেত্রে দেখা হয়। আমরা সেই ক্ষেত্রের একটি অংশ উত্সর্গ করতে এসেছি, যারা এখানে তাদের জীবন দিয়েছিল যাতে সেই জাতি বেঁচে থাকতে পারে তার জন্য একটি চূড়ান্ত বিশ্রামের জায়গা হিসাবে। এটি পুরোপুরি উপযুক্ত এবং যথাযথ যে আমাদের এটি করা উচিত। তবে, বৃহত্তর অর্থে, আমরা উত্সর্গ করতে পারি না, আমরা পবিত্র করতে পারি না, আমরা এই জায়গাটিকে পবিত্র করতে পারি না। জীবিত ও মৃত সাহসী পুরুষরা, যারা এখানে সংগ্রাম করেছিলেন, তারা এটি পবিত্র করেছেন, যোগ বা বিযুক্ত করার জন্য আমাদের দুর্বল শক্তির aboveর্ধ্বে। পৃথিবী খুব কম খেয়াল করবে না, বা আমরা এখানে যা বলেছি তা বেশিদিন মনে রাখবে না, তবে তারা এখানে কী করেছিল তা তা কখনও ভুলতে পারে না। আমাদের এখানেই বেঁচে থাকার চেয়ে বরং এখানে যে তারা এখানে লড়াই করেছিল তারা অসম্পূর্ণ কাজের জন্য এখানে উত্সর্গ করা বেঁচে আছে is বরং আমাদের এখানে থাকা আমাদের মহান কাজের প্রতি নিবেদিত হওয়াটাই এই যে- এই সম্মানিত মৃতদের মধ্য থেকে আমরা সেই কারণটির প্রতি আরও নিষ্ঠা গ্রহণ করি যার জন্য তারা ভক্তিটির সর্বশেষ পরিমাপ দিয়েছে that আমরা এখানে অত্যন্ত দৃ resolve় সংকল্পবদ্ধ যে এই মৃত ব্যক্তিরা হবে না নিরর্থকভাবে মারা গেছে - Godশ্বরের অধীনে এই জাতি স্বাধীনতার নতুন জন্ম নেবে-এবং জনগণের দ্বারা জনগণের সরকার পৃথিবী থেকে বিনষ্ট হয় না।

মোট (সঙ্কুচিত): 6135 অক্ষর / বাইট।

আনন্দ কর!


7
এটি কোনও ভাষা উদ্ভাবন করা কোন চ্যালেঞ্জ নয়, কিছু সংকোচনের জন্য এটি একটি চ্যালেঞ্জ।
জাস্টিন

2
আমি মনে করি স্কোরের মধ্যে সংকলক / এক্সিকিউটার (সংক্ষেপক / ডেকম্প্রেসর) এর আকারটি অন্তর্ভুক্ত না করা এই চ্যালেঞ্জটিকে কিছুটা মুক্ত-সমাপ্ত করে তোলে। এক পর্যায়ে, অভিধান এবং হার্ড-কোডিংয়ের মধ্যে লাইনটি খুব পাতলা হয়ে যাবে।
ডেনিস

2
ডার্ন, এবং এখানে আমি ইতিমধ্যে টাইপ করছিলাম private static final String RICK_ROLL_RETURN = "We're no strangers to love...
গ্রাফ থিওরি

1
আপনি ডেনিসের পর্যবেক্ষণকে সম্বোধন করেছেন বলে আমি মনে করি না।
পিটার টেলর

1
@ এক্সেম আমি মনে করি যে পোস্টটি # টাস্ক, # ইনপুট, # আউটপুট, # স্কারিংয়ের মতো বিভাগগুলিতে তথ্য সংগঠিত করে উন্নত করা যেতে পারে। আমি আরও মনে করি যে সংক্ষেপক এবং ডিকম্প্রেসারের জন্য উত্স কোডের আকারটি স্কোরের মধ্যে অন্তর্ভুক্ত করা উচিত। এটি কোনও ক্ষতি করে না, তবে ডেনিস নির্দেশিত সমস্যাটি সমাধান করে।
রেনবোল্ট

উত্তর:


6

হাস্কেল - 5322 পয়েন্ট

কোড বাইট: 686

মূল আকার : 6147 = 1871+415+234+108+204+145+297+211+1209+1453

এনকোডযুক্ত আকার: 4636 = 1396+233+163+92+153+115+197+164+979+1144

স্কোর: 686+ 4636

অক্ষর গণনা সংক্ষেপণ: ~25%

কোড

অপ্টিমাইজেশন একপাশে রেখে, এটি ইউনিকোড অক্ষরের মধ্যে 0এবং 7fতাদের প্রধান উপাদান হিসাবে মানগুলি সঞ্চয় করে।

এটি এনকোডড আউটপুটটির বাইট সংখ্যা কমায় না, এটি কেবল ইউনিকোড অক্ষরের সংখ্যা হ্রাস করে। উদাহরণস্বরূপ, পরীক্ষা # 4 টিতে 108অক্ষর এবং এনকোডড আউটপুট থাকে 92। তাদের নিজ নিজ মাপ যাইহোক 108এবং 364বাইট হয়।

import Data.Bits
import Data.List
import Data.Numbers.Primes
import qualified Data.Text as T
a=nub$concat$map(primeFactors)[0..127]
d(a:r)c=let s=shift c 5in if s<=0x10ffffthen d r(s+a)else c:d r a
d[]c=[c]
f(a:r)=let o=a.&.0x1fin(if o/=a then f((shiftR a 5):r)else f r)++[o]
f[]=[]
g=T.pack.map(toEnum).(\(a:r)->d r a).concatMap j.map(map(\x->head$elemIndices x a)).map(primeFactors.fromEnum).T.unpack
h=T.pack.map(toEnum.product.map((!!)a)).i.f.reverse.map(fromEnum).T.unpack
i(a:r)=let z=a`clearBit`4;x=if a`testBit`4then(take z$repeat$head r,tail r)else splitAt z r in[fst x]++i(snd x)
i[]=[]
j x@(a:_)=let l=length x in if(take l(repeat a))==x then[l`setBit`4,a]else[l]++x
j[]=[0]

কিভাবে এটা কাজ করে

  • এনকোডিং

    1. প্রতিটি অক্ষর তার সংখ্যার সমতুল্য রূপান্তরিত হয়, এই নম্বর কল করতে দিন n
    2. nতারপরে তার প্রধান কারণগুলির তালিকায় রূপান্তরিত হয় ps,।
      • এটি সুবিধামত ঘটে যে 0 থেকে 127 পর্যন্ত সংখ্যাগুলি বাদ দিয়ে 32 টি সাধারণ প্রধান কারণ রয়েছে 1। এর অর্থ তারা, কারণগুলি 5 বিট হিসাবে কম সূচী হিসাবে সংরক্ষণ করা যেতে পারে।
      • 1 একটি বিশেষ ক্ষেত্রে এবং খালি তালিকা দ্বারা প্রতিনিধিত্ব করা হয়।
    3. psএনকোডিং দিয়ে এখন শুরু করতে পারেন।
      1. প্রতিটি সংখ্যাকে ps32 অনন্য কারণের তালিকায় তার সূচীতে রূপান্তরিত করা হয় (উপরের কোডে এই তালিকাটি চিহ্নিত করা হয়েছে a)।
      2. (এই মুহুর্তে মাথায় রাখুন আমরা মূল কারণগুলির সূচকের তালিকার একটি তালিকা নিয়ে কাজ করছি) পরবর্তী পদক্ষেপে এগিয়ে যাওয়ার জন্য, psসমতল করা দরকার। তথ্যের অখণ্ডতা রক্ষা করতে, প্রতিটি তালিকা দুটি অংশের অন্য তালিকায় রূপান্তরিত হয়
        1. প্রথম উপাদানটি তার দৈর্ঘ্য সঞ্চয় করে এবং যদি এটি একই ফ্যাক্টর দ্বারা গঠিত।
          • প্রতি তালিকায় সর্বাধিক prime টি প্রধান উপাদান রয়েছে, এই তথ্যটি ডানদিকের 3 টি বিটগুলিতে সঞ্চয় করা হয়। পঞ্চম বিটটি তালিকাতে কোনও একক উপাদান নিয়ে গঠিত কিনা তা চিহ্নিত করতে পতাকা হিসাবে ব্যবহৃত হয়।
        2. বাকী উপাদানগুলি হ'ল সূচকগুলি নিজেরাই বা একক সূচক হয় যদি তালিকায় দুটিরও কম কারণ থাকে।
      3. এই তালিকাগুলি পরে একটি একক সমতল তালিকাতে সংযুক্ত করা হয় fs,।
    4. fsএরপরে উপাদানগুলি বিট শিফটিং ব্যবহার করে ইউনিকোড অক্ষরে প্যাক করা যায়।
  • গঠনের কথা মাথায় রেখে

    • বিপরীতে এনকোডিং পদক্ষেপগুলি করুন।
    • আপনি যদি ভাবছেন যে এটি কীভাবে 1খাপ খায় তবে আমি আপনাকে এটি মনে করিয়ে দিতে চাই product [] == 1

টেস্ট

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

edTest f = do
    t <- readFile f
    let txt = T.pack t
        enc = g txt
        dec = h enc
        tst = txt == dec
    putStrLn $ (show $ T.length txt) ++ "," ++ (show $ T.length enc) ++ "," ++ (show $ T.length dec)++","++(show tst)
    putStrLn $ if not tst then T.unpack txt ++ "\n---NEXT---\n" ++ T.unpack dec else ""


λ> edTest "1"
1871,1396,1871,True

λ> edTest "2"
412,233,412,True

λ> edTest "3"
234,163,234,True

λ> edTest "4"
108,92,108,True

λ> edTest "5"
204,153,204,True

λ> edTest "6"
145,115,145,True

λ> edTest "7"
297,197,297,True

λ> edTest "8"
211,164,211,True

λ> edTest "9"
1209,979,1209,True

λ> edTest "10"
1453,1144,1453,True

নমুনা

gটেস্ট # 4 এর জন্য এনকোডিং ফাংশনের আউটপুট এটি
"\99429\582753\135266\70785\35953\855074\247652\1082563\68738\49724\164898\68157\99429\67973\1082404\587873\73795\298017\330818\198705\69861\1082435\595009\607426\36414\69873\855074\265249\346275\67779\68738\77985\1082513\821353\132131\101410\247652\1082562\49724\164898\67649\594977\34915\67746\50273\135265\103997\563265\103457\1086021\99399\584802\70753\73889\34882\582722\411459\67779\68740\1084516\1082563\1091681\103491\313282\49724\164897\68705\135741\69858\50241\607426\35905\608421\1082435\69858\50274\71777\43075\298018\280517\1082404\67971\36017\955425\67665\919600\100452\132129\214883\35057\856097\101474\70753\135737"
বা আপনি জিব্বারিশের পারদর্শী হন তবে এটি
𘑥򎑡𡁢𑒁豱󐰢𼝤􈓃𐲂숼𨐢𐨽𘑥𐦅􈐤򏡡𒁃񈰡񐱂𰠱𑃥􈑃򑑁򔓂踾𑃱󐰢񀰡񔢣𐣃𐲂𓂡􈒑󈡩𠐣𘰢𼝤􈓂숼𨐢𐡁򑐡衣𐢢쑡𡁡𙘽򉡁𙐡􉉅𘑇򎱢𑑡𒂡衂򎑂񤝃𐣃𐲄􈱤􈓃􊡡𙑃񌟂숼𨐡𐱡𡈽𑃢쑁򔓂豁򔢥􈑃𑃢쑢𑡡ꡃ񈰢񄟅􈐤𐦃貱󩐡𐡑󠠰𘡤𠐡𴝣裱󑀡𘱢𑑡𡈹

সংযোজন নোট

  • Http://mothereff.in/byte-c কাউন্টার ব্যবহার করে , ডিরেক্টরি তালিকা এবং edTestপরীক্ষার আকার সব সামঞ্জস্যপূর্ণ তবে তবুও প্রশ্নের মধ্যে নির্দেশিত আকার থেকে পৃথক।
  • টেস্ট # 10 (ই.এম. ড্যাশ দুয়েক রয়েছে ) যে আমি দিয়ে প্রতিস্থাপিত -যেহেতু তারা বাইরে 0- 7fপরিসীমা।
  • সমতলকরণের সময় বাকী চতুর্থ বিট ব্যবহার করে আরও সংক্ষেপণ অর্জন করা যেতে পারে, উদাহরণস্বরূপ, 00বেস কেস, 01সমস্তটি পুনরাবৃত্তি করুন, 10শেষ 11ব্যতীত পুনরাবৃত্তি করুন, শেষ দুটি ব্যতীত পুনরাবৃত্তি করুন।
  • পরীক্ষার ফাইল এবং কোড সমস্ত এখানে উপলভ্য https://github.com/gxtaillon/codegolf/tree/master/Kolmogorov

হ্যালো, এই উত্তরের জন্য ধন্যবাদ! :) আমি বুঝতে পারিনি বাইনারিতে কি হয় যখন আপনি রূপান্তর abcdefghijklm...করেন 𘑥򎑡𡁢𑒁豱󐰢𼝤..., আপনি কি আরও কিছুটা ব্যাখ্যা করতে পারেন দয়া করে? এছাড়াও, আমি চার্টের গণনাগুলি স্থির করেছি এবং প্রশ্নে # 10 তে এম-ড্যাশগুলি রূপান্তর করেছি। যদিও আমার চর গণনাগুলি এখনও আপনার চেয়ে আলাদা। কেন, আমি মোটেরেফ.ইন. সরঞ্জামটি ব্যবহার করেছি।
xem

@ xem জটিল জটিল বিবরণ প্রকাশিত হয়েছে।
gxtaillon

আমার মনটি (রূপকভাবে) আক্ষরিকভাবে এই ধারণাটি দ্বারা প্রসারিত হয়েছে যে 0 এবং 2-127 নম্বরগুলি 5 টি বিটের মধ্যে এনকোড করা যায়। আপনি এটি নিজের দ্বারা খুঁজে পেয়েছিলেন বা এটি কিছু জানা ছিল? বোনাস প্রশ্ন: আপনাকে কেবলমাত্র মুদ্রণযোগ্য আসকি অক্ষর, অর্থাৎ 95 টি আলাদা অক্ষর সংরক্ষণ করতে হবে?
xem

@ xem সংখ্যাগুলি 5 টি বিটকে এনকোড করা হয়নি, তাদের প্রতিটি কারণ রয়েছে। আমি খুব খুশি হব যদি আমি মাত্র 5 টিতে 7 টি বিটকে এনকোডিংয়ের কোনও উপায় খুঁজে পেয়েছি তবে Ascii অক্ষর হিসাবে, এই পদ্ধতিটি ব্যবহার করে তাদের এখনও প্রতিটি বিট প্রয়োজন হবে need
gxtaillon

1
যেহেতু আপনি নির্ধারিত ব্যাপ্তিতে সংখ্যার উপরে সর্বাধিক 6 টি কারণ রয়েছে, দৈর্ঘ্য 5 বিট "ব্লক" এর মধ্যে 3 ব্যবহার করে। তারপরে সূচকগুলি 5 টি বিটে এনকোড করা হবে, হ্যাঁ। এই প্রয়োগে, দৈর্ঘ্যের ব্লকের 2 টি অব্যক্ত বিটগুলির মধ্যে একটি অতিরিক্ত সংকোচনের জন্য ব্যবহৃত হয়।
gxtaillon

4

সি ++ (সি ++ 11), 2741 পয়েন্ট

এই উত্তরটি সংক্ষেপিত পাঠ্যের এনকোডিং হিসাবে UTF-32 ব্যবহার করে।

#include <cstdio>
#include <iostream>
#include <locale>
#include <string>
#define L locale
using namespace std;long b,n,i,l;void c(){string d;char x;while((x=cin.get())!=EOF)d+=x;b=(d.size()*7)%20;n=5;wcout.imbue(L());for(char y:d){b=b<<7|y&127;n+=7;if(n>=20)wcout.put(b>>(n-=20)&0xFFFFF);}if(n)wcout.put(b<<20-n&0xFFFFF);}void d(){wstring d;wchar_t w;wcin.imbue(L());while((w=wcin.get())!=EOF)d+=w;l=-1;for(wchar_t y:d){b=b<<20|y;n+=20;if(l<0)l=b>>15&31,n-=5;while(n>=7&(i<d.size()-1|n>20-l))cout.put(b>>(n-=7)&127);++i;}}int main(int t,char**a){L::global(L("en_US.utf8"));**++a<'d'?c():d();}

চর গণনা এবং স্কোরিং

কোড: 593 টি অক্ষর (পেছনের নতুন লাইনটি কেটে নেওয়া হয়েছে)

সংক্ষিপ্ত পাঠগুলি (ইউনিকোড অক্ষর) : 654 + 145 + 82 + 38 + 51 + 104 + 73 + 423 + 506 = 2148 ( wc -mবাইটের পরিবর্তে ইউনিকোড অক্ষরের সংখ্যার জন্য গণনা করা, বাইট গণনাগুলি @ gxtaillon এর উত্তর হিসাবে রয়েছে , মূল থেকে বেশি, মোট 8413 বাইট, গণনা করা হিসাবে wc -c)।

সংকোচন অনুপাত (এএসসিআইআই থেকে ইউনিকোড) : 35.01% (প্রশ্ন থেকে 6135 বাইট ব্যবহার করে (একই wc -c))

সতর্ক থাকুন:

প্রচুর শেল এই প্রোগ্রামটি তৈরি করে ইউনিকোড অক্ষর পরিচালনা করতে পারে না। stdinশেল থেকে কোনও ইনপুট নেওয়া হওয়ায় শিক কোনও অক্ষর পরিচালনা করতে না পারলে ডিকম্প্রেসিংয়ের ফলে পাঠ্যটি কেটে যেতে পারে ।

কম্পাইল

এটা দিয়ে কম্পাইল করা উচিত clang++এবং g++ -std=c++11, কিন্তু এটা, অপারেটর প্রাধান্য সম্পর্কে কিছু সতর্কবার্তা প্রদর্শন করা হবে মতো অভিব্যক্তি হিসাবে b<<20-n&0xFFFFFহিসাবে গণ্য করা হবে না ((b << 20) - n) & 0xFFFFF, যেমন এক আশা করতে পারে, বরং যেমন (b << (20 - n)) & 0xFFFFF

ব্যবহার

  • প্রোগ্রামটিকে একটি এক্সিকিউটেবল, যেমন- মধ্যে সংকলন করুন ./compress
  • ./compress cসংকোচনের জন্য বা ./compress dসংক্ষেপিত করার জন্য প্রোগ্রামটি চালান । (সাবধান, বিকল্পটি বাদ দিয়ে একটি সেগফুল্ট দেয় (ত্রুটি পরীক্ষা করা এতটা চরিত্রের ব্যয়বহুল ...)) এবং অন্যান্য বিকল্পগুলি (যেমন Dপরিবর্তে ব্যবহার করা d) অপ্রত্যাশিত ফলাফল দিতে পারে
  • ইনপুট থেকে পড়ে stdinএবং আউটপুট এ লেখা হয়stdout

কিভাবে এটা কাজ করে

Ungolfed

#include <cstdio>
#include <iostream>
#include <locale>
#include <string>

using namespace std;

long b, n, i, l;

// Compress
void c() {
    string d;
    char x;
    // Read from STDIN until EOF
    while((x = cin.get()) != EOF)
        d += x;
    // Calculate the number of bits used from the last unicode character
    // (maximum 19) and store it into the first 5 bits
    b = (d.size() * 7) % 20;
    n = 5;
    // Set the output locale to allow unicode
    wcout.imbue(locale());
    // For each character in the input...
    for (char y : d) {
        // Add its bit representation (7 bits) to the right of the buffer
        // by shifting the buffer left and ORing with the character code
        b = (b << 7) | (y & 127);
        // Add 7 to the bit counter
        n += 7;
        // If enough data is present (20 bits per output character),
        // calculate the output character by shifting the buffer right,
        // so that the last 20 bits are the left 20 bits of the buffer.
        // Also decrement the bit counter by 20, as 20 bits are removed.
        if (n >= 20)
            wcout.put((b >> (n -= 20)) & 0xFFFFF);
    }
    // If there are still bits in the buffer, write them to the front of
    // another unicode character
    if (n)
        wcout.put((b << (20 - n)) & 0xFFFFF);
}

// Decompress
void d() {
    wstring d;
    wchar_t w;
    // Set STDIN to UNICODE
    wcin.imbue(locale());
    // Read wide characters from STDIN (std::wcin) until EOF
    while ((w = wcin.get()) != EOF)
        d += w;
    // `l' represents the number of bits used in the last unicode character.
    // It will be set later
    l = -1;
    // For each input character...
    for (wchar_t y : d) {
        // Add it to the buffer and add 20 to the bit counter
        b = (b << 20) | y;
        n += 20;
        // If the number of bits in the last unicode character has not been
        // set yet, read the first 5 buffer bits into `l'. This is
        // necessary because the last character may contain more than 7
        // (one entire uncompressed character) unused bits which may
        // otherwise be interpreted as garbage.
        if (l < 0) {
            l = (b >> 15) & 31;
            n -= 5;
        }
        // As long as there is data to turn into output characters
        // (at least 7 bits in the buffer and either not the last
        // unicode character or before the unused bits)
        while (n >= 7 && ((i < d.size() - 1) || (n > (20 - l)))
            cout.put((b >> (n -= 7)) & 127); // Output the left 7 bits in the buffer as an ASCII character
        ++i; // Increment the character index, so that we know when we reach the last input character
    }
}
int main(int t, char**a) {
    // Set the default locale to en_US.utf8 (with unicode)
    locale::global(locale("en_US.utf8"));
    // Decide whether to compress or decompress.
    // This is just fancy pointer stuff for a[1][0] < 'd' ? c() : d()
    (**(++a) < 'd') ? c() : d();
}

ব্যাখ্যা

থেকে সব ইউনিকোড অক্ষর হিসেবে U+0000থেকে U+10FFFFঅনুমতি দেওয়া হয়, আমরা ইউনিকোড গৃহস্থালির কাজ প্রতি 20 বিট ব্যবহার করতে পারেন: U+FFFFF20 বিট ব্যবহার করে এবং এখনও অনুমতি দেওয়া সীমার মধ্যে অন্তর্ভুক্ত করা হয়। সুতরাং, আমরা কেবলমাত্র একটি ইউনিকোড অক্ষরে একাধিক ASCII অক্ষর সংরক্ষণ করতে ইউনিকোড অক্ষরগুলিতে সমস্ত পৃথক ASCII চর বিট ক্র্যাম করার চেষ্টা করি। তবে, আমাদের সর্বশেষ ইউনিকোড চরিত্রে ব্যবহৃত বিটের সংখ্যাও সংরক্ষণ করতে হবে, কারণ অব্যবহৃত আবর্জনার বিটগুলি অন্যথায় যথাযথ সংকুচিত ASCII অক্ষর হিসাবে ব্যাখ্যা করা যেতে পারে। সর্বশেষ ইউনিকোড চরিত্রে ব্যবহৃত বিটের সর্বাধিক সংখ্যা 20 হ'ল, এর জন্য আমাদের 5 বিট লাগবে, যা সংকুচিত তথ্যের শুরুতে স্থাপন করা হবে।

উদাহরণ আউটপুট

এটি ফলাফল হিসাবে উদাহরণস্বরূপ # 4 (প্রদত্ত হিসাবে less):

<U+4E1C5><U+8F265><U+CD9F4><U+69D5A><U+F66DD><U+DBF87><U+1E5CF><U+A75ED>
<U+DFC79><U+F42B8><U+F7CBC><U+BA79E><U+BA77F>쏏𦛏<U+A356B><U+D9EBC><U+63ED8>
<U+B76D1><U+5C3CE><U+6CF8F><U+96CC3><U+BF2F5><U+D3934><U+74DDC><U+F8EAD>
<U+7E316><U+DEFDB><U+D0AF5><U+E7C77><U+EDD7A><U+73E5C><U+786FD><U+DB766>
<U+BD5A7><U+467CD><U+97263><U+C5840>

( চরিত্রের কোড হিসাবে 쏏𦛏প্রদান করুন <U+C3CF><U+266CF>, তবে আমি সম্ভবত এটি ভুল করে ফেলেছি)


2

পাইথন 3, 289 + 818 = 1107 পয়েন্ট

কেবল হালকাভাবে গল্ফড

import zlib as Z
def p(s):
 z=int.from_bytes(Z.compress(s),'big');o=''
 while z:
  z,d=divmod(z,1<<20)
  if d>0xd000:d+=1<<16
  o+=chr(d)
 return o[::-1]
def u(s):
 i=0
 for c in s:
  d=ord(c)
  if d>0xe000:d-=1<<16
  i=(i<<20)+d
 return Z.decompress(i.to_bytes(i.bit_length()//8+1,'big'))

মোট কোডের আকারটি 289 বাইট, এবং প্রদত্ত 6135 বাইটকে 818 ইউনিকোড অক্ষরে এনকোড করে - মোট আউটপুট বাইট গণনা 3201 বাইট, মূল ইনপুটগুলির তুলনায় উল্লেখযোগ্যভাবে ছোট।

Zlib ব্যবহার করে এনকোডগুলি, তারপর দ্বিতীয়ত ইউনিকোড এনকোডিং ব্যবহার করে। সার্গেটগুলি এড়াতে কিছু অতিরিক্ত যুক্তি প্রয়োজন (যা পাইথন সত্যই ঘৃণা করে)।

# 4 থেকে আউটপুট উদাহরণ হিসাবে দেখা হয়েছে less(37 ইউনিকোড অক্ষর):

x<U+AC0DC><U+BB701><U+D0200><U+D00B0><U+AD2F4><U+EEFC5>𤆺<U+F4F34>멍<U+3C63A><U+2F62C><U+BA5B6><U+4E70A><U+F7D88><U+FF138><U+40CAE>
<U+CB43E><U+C30F5><U+6FFEF>𥠝<U+698BE><U+9D73A><U+95199><U+BD941><U+10B55E><U+88889><U+75A1F><U+4C4BB><U+5C67A><U+1089A3><U+C75A7>
<U+38AC1><U+4B6BB><U+592F0>ᚋ<U+F2C9B>

পরীক্ষার জন্য ড্রাইভার প্রোগ্রাম:

if __name__ == '__main__':
    import os
    total = 0
    for i in range(1,10+1):
        out = p(open('data/%d.txt'%i,'rb').read())
        total += len(out)
        open('out/%d.bin'%i,'w',encoding='utf8').write(out)
    print(total)
    for i in range(1,10+1):
        out = u(open('out/%d.bin'%i,'r',encoding='utf8').read())
        open('data2/%d.txt'%i,'wb').write(out)

আউটপুট বাইট গণনা:

 607 out/1.bin
 128 out/2.bin
 101 out/3.bin
 143 out/4.bin
 177 out/5.bin
 145 out/6.bin
 186 out/7.bin
 222 out/8.bin
 389 out/9.bin
1103 out/10.bin
3201 total

1
এটি কি কোনও কম্প্রেশন লাইব্রেরিটি কিছুটা প্রতারণা করে ব্যবহার করছে তা নয়?
বিটা ক্ষয়

@ বেটাডে: প্রশ্নটিতে এটি সীমাবদ্ধ নয়, তাই আমি অনুভব করেছি যে এটি নিখরচায় খেলা ছিল।
nneonneo

এছাড়াও, আপনাকে একটি ডিকম্প্রেসার অন্তর্ভুক্ত করতে হবে।
বিটা ক্ষয়

@ বেটাডেকে: pপ্যাকার হ'ল, আনপ্যাকার u
nneonneo

1

পাইথন 2 - 1141 পয়েন্ট

from zlib import *;v=256
def e(b):
 x=0
 for c in compress(b,9):x=(x*v)+ord(c)
 b=bin(x)[2:]
 return "".join(unichr(int("1"+b[a:a+19],2))for a in range(0,len(b),19))
def d(s):
 y=int("".join(bin(ord(a))[3:]for a in s),2);x=""
 while y:y,d=(y/v,chr(y%v));x=d+x
 return decompress(x)

কোডের আকারটি 281বাইট এবং এটি 6135বাইটগুলি 860ইউনিকোড অক্ষরগুলিতে এনকোড করে ।

কিভাবে এটা কাজ করে:

এনকোড করতে:

  1. এনকোড করার জন্য স্ট্রিংটি সঙ্কুচিত করুন।
  2. সংক্ষিপ্ত স্ট্রিংটিকে বেস 256 সংখ্যা হিসাবে ব্যাখ্যা করুন।
  3. সংখ্যাটি বাইনারি রূপান্তর করুন।
  4. বাইনারিগুলি 19বিটের গ্রুপগুলিতে বিভক্ত 1করুন, তাদের প্রত্যেকের শুরুতে কিছুটা যুক্ত করুন এবং তারপরে ইউনিকোডের অক্ষরগুলিতে রূপান্তর করুন।

ডিকোডিং হ'ল বিপরীত।

দ্রষ্টব্য যে পাইথনের কয়েকটি সংস্করণ কেবল ইউনিকোড অক্ষর পর্যন্ত পরিচালনা করতে পারে 0xFFFFএবং এইভাবে এই কোডটি একটি বাড়িয়ে তুলবে ValueError

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.