Bzip2 এর রান-দৈর্ঘ্যের এনকোডিং কার্যকর করুন


14

পটভূমি

বিডাব্লুটিটি প্রয়োগ করার পরে (যেমনটি বুড়ো, হুইলার এবং পিছনে দেখা যায় ) এবং এমটিএফ ( মুদ্রণযোগ্য এএসসিআইআই সম্মুখভাগে সরানো হিসাবে দেখা যায় ), bzip2 সংক্ষেপক রান-দৈর্ঘ্যের এনকোডিংয়ের পরিবর্তে অনন্য রূপ প্রয়োগ করে।

সংজ্ঞা

এই চ্যালেঞ্জের উদ্দেশ্যে, আমরা রূপান্তর বিআরএলএকে সংজ্ঞায়িত করেছি:

প্রদত্ত একটি ইনপুট স্ট্রিং গুলি যে একমাত্র 0x20 এবং 0x7A মধ্যে কোড পয়েন্ট সঙ্গে ASCII অক্ষর নিয়ে গঠিত নিচের কাজগুলো করুন:

  1. প্রথমটির পরের অক্ষরের একক সংঘটন দ্বারা সমান অক্ষরের প্রতিটি রানকে প্রতিস্থাপন করুন store

  2. দ্বিপাক্ষিক বেস -২ সংখ্যা এবং চিহ্নগুলি এবং ব্যবহার করে চরিত্রের প্রথম উপস্থিতির পরে পুনরাবৃত্তির সংখ্যা এনকোড করুন ।{}

    একটি অ নেতিবাচক পূর্ণসংখ্যা এন স্ট্রিং হিসেবে এনকোড করা আছে ... খ 0 যেমন যে এন = 2 আমি (খ ) ... +2 0 আমি (খ 0 ) , যেখানে আমি ( {) = 1 এবং আমি ( }) = 2

    মনে রাখবেন যে এই উপস্থাপনাটি সর্বদা অনন্য। উদাহরণস্বরূপ, 0 নম্বরটি একটি খালি স্ট্রিং হিসাবে এনকোড করা হয়েছে।

  3. সংশ্লিষ্ট চরিত্রের একক ঘটনার পরে পুনরাবৃত্তির সংখ্যা এনকোড করে এমন কোঁকড়া বন্ধনীগুলির স্ট্রিং .োকান।

ধাপে ধাপে উদাহরণ

Input:  "abbcccddddeeeeeffffffggggggghhhhhhhh"
Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7
Step 2: "" "{" "}" "{{" "{}" "}{" "}}" "{{{"
Step 3: "ab{c}d{{e{}f}{g}}h{{{"

কার্য

STDIN থেকে বা কমান্ড-লাইন বা ফাংশন আর্গুমেন্ট হিসাবে একটি একক স্ট্রিং পড়া বা বিআরএল বা এর ইনপুট স্ট্রিংয়ের বিপরীতটি প্রিন্ট করে বা ফেরত দেয় এমন একটি অন্তর্ভুক্ত প্রোগ্রাম বা ফাংশন প্রয়োগ করুন।

যদি ইনপুটটিতে কোনও কোঁকড়া বন্ধনী থাকে না, BRLE প্রয়োগ করুন। যদি ইনপুটটিতে কোঁকড়ানো বন্ধনী থাকে তবে এর বিপরীতটি প্রয়োগ করুন।

উদাহরণ

INPUT:  CODEGOLF
OUTPUT: CODEGOLF

INPUT:  PROGRAMMING
OUTPUT: PROGRAM{ING

INPUT:  PUZ{LES
OUTPUT: PUZZLES

INPUT:  444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
OUTPUT: 4{{8{{{G{{{{W{{{{{

INPUT:  y}}}{{
OUTPUT: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

অতিরিক্ত বিধি

  • আপনি কোনও বিল্ট-ইন ব্যবহার করতে পারবেন না যা বিআরএল বা তার একটি স্ট্রিংয়ের বিপরীতমুখী গণনা করে।

  • আপনি বিল্ট-ইনগুলি ব্যবহার করতে পারেন যা:

    • একটি স্ট্রিংয়ের আরএলই বা আরএলডি গণনা করুন, যতক্ষণ না দ্বিঘাতী বেস -২ এ পুনরাবৃত্তির সংখ্যা সংরক্ষণ করা হয় না।

    • যে কোনও ধরণের বেস রূপান্তর সম্পাদন করুন।

  • আপনি যদি আউটপুট জন্য STDOUT চয়ন করেন তবে আপনার কোডটি একটি ট্রেলিং নিউলাইন মুদ্রণ করতে পারে।

  • আপনার কোডটি 0x20 থেকে 0x7A, আরও কোঁকড়া বন্ধনী (0x7B এবং 0x7D) এর পরিসীমাতে 1000 বা তার চেয়ে কম ASCII অক্ষরের কোনও ইনপুট জন্য কাজ করতে হবে।

  • যদি ইনপুটটিতে কোঁকড়ানো বন্ধনী রয়েছে, আপনি ধরে নিতে পারেন যে এটি স্ট্রিতে BRLE প্রয়োগের একটি বৈধ ফলাফল।

  • স্ট্যান্ডার্ড কোড গল্ফ বিধি প্রযোজ্য। বাইটস মধ্যে সংক্ষিপ্ততম জমা জয়।


বিল্টিনগুলিকে কেন অনুমতি দেওয়া হচ্ছে না?
মিলকিওয়াই 90

উত্তর:


4

CJam, 50 48 বাইট

l_{}`:T&1${_T#)_(@a?)+}%{(\2b)*}%@e`{(2b1>Tf=}%?

2 বাইট সংরক্ষণের জন্য ডেনিসের জন্য ধন্যবাদ।

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা

l_              e# Read and duplicate input.
{}`:T           e# T = "{}"
&               e# If the input has '{ or '}:
    1$          e# Input.
    {           e# For each character:
        _T#)    e# If it is '{ or '}:
            _(  e# Return 0 for '{ or 1 for '}.
            @a  e# Otherwise, convert the character itself to an array (string).
        ?
        )+      e# If it is a number, increment and append to the previous array.
                e# If it is a string with at least 1 character, do nothing.
    }%
    {(\         e# For each character and bijective base 2 number:
        2b)*    e# Repeat the character 1 + that many times.
    }%
                e# Else:
    @           e# Input.
    e`          e# Run-length encoding.
    {(          e# For each character and length:
        2b1>    e# Convert the length to base 2 and remove the first bit.
        Tf=     e# Map 0 to '{ and 1 to '}.
    }%
?               e# End if.

3

পাইথ, 48 50 বাইট

J`Hs?m*hdi+1xLJtd2tczf-@zTJUz@Jzsm+ed@LJtjhd2rz8

2 বাইটস @ মাল্টেসেনকে ধন্যবাদ

প্রদর্শন. পরীক্ষার জোতা।

ব্যাখ্যা:

J`Hs?m*hdi+1xLJtd2tczf-@zTJUz@Jzsm+ed@LJtjhd2rz8
                                                    Implicit: z = input()
                                                    H is empty dict.
J`H                                                 J = repr(H) = "{}"
   s                                                Print the concatenation of
    ?                        @Jz                    If z and J share any chars:
                     f     Uz                       Filter range(len(z))
                      -@zTJ                         On the absence of z[T] in J.
                   cz                               Chop z at these indices.
                                                    just before each non '{}'.
                  t                                 Remove empty initial piece.
     m*hd                                           Map to d[0] *
         i       2                                  the base 2 number                             
            xLJtd                                   index in J mapped over d[:-1]
          +1                                        with a 1 prepended.
                                             rz8    Otherwise, run len. encode z
                                 m                  map over (len, char)
                                         jhd2       Convert len to binary.
                                        t           Remove leading 1  
                                     @LJ            Map to element of J.
                                  +ed               Prepend char.
                                s                   Concatenate. 

পরিবর্তে "{}"আপনি ব্যবহার করতে পারেন `H, সিজেমের সাথে বাঁধা :)
মালটিসেন

@ জাকুব মিশ্রণটির জন্য দুঃখিত।
isaacg

2

ওক্যামেল, 252

t রূপান্তর করে ফাংশন।

#load"str.cma"open Str
let rec(!)=group_beginning and
g=function|1->""|x->(g(x/2)^[|"{";"}"|].(x mod 2))and($)i s=if g i=s then i else(i+1)$s and
t s=global_substitute(regexp"\(.\)\1*\([{}]*\)")(fun s->String.make(1$matched_group 2 s)s.[!1]^g(!2- !1))s

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


the encoding part proved equally harmlessএটা কি পারে? এনকোডিং 4{{8{{{G{{{{W{{{{{আপনি পাবেন না 4{{8{}G{{{W{{}?
edc65

@ edc65 না, উদাহরণগুলিতে নির্দিষ্ট উত্তর পেয়েছি। আপনি কিভাবে এটি পরীক্ষা করছেন?
ফেয়ারসাম

"4 {{8 {{{G {{{{{W {{{{{" ইনপুট হিসাবে উদাহরণগুলির মধ্যে একটি নয়। তুমি কি চেষ্টা করেছ?
edc65

@ edc65 এটি উদাহরণগুলির মধ্যে একটির বিপরীত এবং আমি সেগুলি উভয় উপায়ে পরীক্ষা করেছি। হ্যাঁ, আমি আপনার মন্তব্য পোস্ট করার আগে এবং পরে উভয়ই চেষ্টা করেছি।
ফেয়ারসাম

ঠিক আছে ভালো. আমি উদ্ধৃত বাক্যটির দিকে ইঙ্গিত করলাম, "সোজা সোজা" এনকোডিং হিসাবে (আমার হিসাবে) প্রদত্ত পরীক্ষার
কেসটি মোটেও

1

জাভাস্ক্রিপ্ট ( ES6 ), 162

f=s=>
(t=s[R='replace'](/[^{}][{}]+/g,n=>n[0].repeat('0b'+n[R](/./g,c=>c!='{'|0))))==s
?s[R](/(.)\1*/g,(r,c)=>c+r.length.toString(2).slice(1)[R](/./g,c=>'{}'[c])):t

// TEST
out=x=>O.innerHTML += x + '\n';

test=s=>O.innerHTML = s+' -> '+f(s) +'\n\n' + O.innerHTML;

[['CODEGOLF','CODEGOLF']
,['PROGRAMMING','PROGRAM{ING']
,['PUZ{LES','PUZZLES']
,['444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW','4{{8{{{G{{{{W{{{{{']
,['y}}}{{','yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy']]
.forEach(v=>{
  w=f(v[0])  
  out('Test ' + (w==v[1]?'OK':'Fail')+'\nInput:    '+v[0]+'\nExpected: '+v[1]+'\nResult:   '+w)
})  
Your test: <input id=I style='width:300px'><button onclick='test(I.value)'>-></button>
<pre id=O></pre>

কিছু ব্যাখ্যা

সংখ্যা এন0 এবং 1 ব্যবহার করে বিবি 2-তে :(n+1).toString(2).slice(1)

বিবি 2 তে সংখ্যায় স্ট্রিং: টু_নম্বার ("0 বি 1" + স্ট্রিং) - অর্থাৎ, বামে 1 টি বাইনারি ডিজিট যুক্ত করুন এবং বাইনারি থেকে রূপান্তর করুন (এবং 1 দ্বারা হ্রাস করুন, এই নির্দিষ্ট উদাহরণে প্রয়োজন নেই)।

কোনও অক্ষর অনুসরণ করা {বা এটি অনুসরণ করার জন্য নিয়মিত অভিব্যক্তি }:/[^{}][{}]+/g

পুনরাবৃত্তি অক্ষরগুলি খুঁজতে নিয়মিত প্রকাশ: /(.)\1*/g

প্রতিস্থাপনে সেই রিজএক্সপ্যাক্স ব্যবহার করে, প্রথম প্যারাম হ'ল "পুনরাবৃত্তি" চর (শেষ পর্যন্ত কেবল 1 বার পুনরাবৃত্তি করুন), দ্বিতীয় প্যারামটি মোট পুনরাবৃত্ত স্ট্রিং, যার দৈর্ঘ্য আমার ইতিমধ্যে 1 দ্বারা বর্ধিত বিবি 2 এ এনকোড করতে হবে এমন নম্বর is

... তারপর সব একসাথে ...

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