একটি পরিবর্তনশীল-দৈর্ঘ্যের পরিমাণ ডিকোড করুন


16

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

এটি যেভাবে কাজ করে তা মোটামুটি সহজ। বাইটের বিগ-এন্ডিয়ান সিরিজ হিসাবে, প্রতিটি বাইটের সর্বাধিক উল্লেখযোগ্য বিট (এমএসবি) 1হ'ল অন্য ভিএলকিউ বাইট অনুসরণ করে indicate প্রতিটি বাইটের অবশিষ্ট 7 টি বিট ডিকোডড মানটি তৈরি করে।

উদাহরণ (উইকিপিডিয়া থেকে):

[ 0x86, 0xc3, 0x17 ] => 106903

এখানে চিত্র বর্ণনা লিখুন অতিরিক্ত তথ্যসূত্র: উইকিপিডিয়া , কিছু লোক

চ্যালেঞ্জ:

একটি পরিবর্তনশীল-দৈর্ঘ্যের পরিমাণ দেওয়া হয়েছে, এটিটিকে পূর্ণসংখ্যার মানতে রূপান্তর করুন।

ইনপুট:

এক থেকে চারটি বাইট বা একটি 32-বিট মান ধরণের একটি পূর্ণসংখ্যার বৈধ VLQ উপস্থাপনের একটি তালিকা A

আউটপুট:

ভিএলকিউ ইনপুটটির পূর্ণসংখ্যা মান।

বিধি এবং স্কোরিং:

  • এটি কোড-গল্ফ, তাই প্রতিটি ভাষার জয়ের জন্য বাইটের মধ্যে সংক্ষিপ্ত উত্তর ।
  • মানক নিয়ম এবং ডিফল্ট আই / ও বিধি প্রয়োগ হয়।
  • লুফোল নিষিদ্ধ (অবশ্যই)।
  • আপনার কোড ( TIO.run , ইত্যাদি) জন্য একটি পরীক্ষা দিয়ে লিঙ্ক সরবরাহ করুন ।
  • আপনার উত্তরের জন্য একটি স্পষ্ট ব্যাখ্যা অত্যন্ত প্রস্তাবিত।
  • এই রূপান্তরটি পরিচালনা করে এমন বিল্ট-ইনগুলি নিষিদ্ধ নয়, তবে সেগুলি ব্যবহার না করা অনেক বেশি আকর্ষণীয়।

পরীক্ষার কেস:

Input (VLQ)                   Output (int)

[                   0x00 ] => 0
[                   0x07 ] => 7
[                   0x7f ] => 127
[             0x81, 0x00 ] => 128
[             0xC0, 0x00 ] => 8192
[             0xff, 0x7f ] => 16383
[       0x81, 0x80, 0x00 ] => 16384
[       0x86, 0xc3, 0x17 ] => 106903
[       0xbd, 0x84, 0x40 ] => 1000000
[       0xff, 0xff, 0x7f ] => 2097151 
[ 0xC0, 0x80, 0x80, 0x00 ] => 134217728  
[ 0xFF, 0xFF, 0xFF, 0x7F ] => 268435455  

দ্রষ্টব্য: আপনার ইনপুট বা আউটপুট হিসাবে বাইট উপস্থাপনের জন্য আপনাকে হেক্স লিটারাল ব্যবহার করার দরকার নেই। আপনার প্ল্যাটফর্মের জন্য উপযুক্ত হলে আপনি দশমিক আক্ষরিক ( [ 129, 128, 0 ]), পূর্ণসংখ্যা ( 0x80818000) বা অন্য কোনও যুক্তিসঙ্গত বাইট / অকটেট উপস্থাপনা ব্যবহার করতে পারেন। ফর্ম্যাটটি যতক্ষণ না এটি 1-4 বাইট / অক্টেটের প্রতিনিধিত্ব করে ততক্ষণ নমনীয়।

গল্ফ দূরে!


ইনপুটটির শেষ বাইটটি <128 গ্যারান্টিযুক্ত? অথবা আমাদের যেমন মামলা সমর্থন করা প্রয়োজন [0x01, 0x80, 0x02] => 1?
আর্নল্ড

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

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

1
@ কেভিন ক্রুইজসেন, একটি পরিবর্তনশীল দৈর্ঘ্যের পরিমাণটি বাইটগুলির একটি ধারা হিসাবে বিবেচিত হয়, যেখানে প্রযুক্তিগতভাবে আপনি কেবল তখনই জানেন যে এটি এমএসবি = 0 চিহ্নিতকারী পৌঁছানোর পরে শেষ হয়। আমি জানি যে নিয়মগুলি বেশ ক্যাপচার করে নি, তবে ভিএলকিউ এর সংজ্ঞা অনুসারে আমি না বলতে হবে।
640 কেবি

1
@gwaugh ঠিক আছে, এটি উপলব্ধি করে এবং আমি যুক্তি বুঝতে পারি। আমি সেই অনুযায়ী আমার ম্যাথগল্ফ উত্তরটি পরিবর্তন করব। :)
কেভিন ক্রুইজসেন

উত্তর:





4

জে , 10 বাইট

128#.128|]

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

জে সেলের এপিএল উত্তর থেকে অনুপ্রেরণা নিচ্ছেন।

  • 128|] 128 দ্বারা বিভক্ত ইনপুট সংখ্যাগুলির অনুস্মারক
  • 128#. একটি বেস 128 সংখ্যার অঙ্ক হিসাবে ব্যাখ্যা করা


3

হ্যাঁ, সেই বিল্টিন আজকাল অকেজো। উত্তরাধিকার সংস্করণে আমি এটির জন্য কিছু ব্যবহার দেখতে পেলাম, কেবলমাত্র যখন আপনার প্রোগ্রামে এটির আগে আপনার একটি সংখ্যা থাকে। অন্যথায় আপনি শুধু ব্যবহার করতে পারে 7o। আজকাল আপনি 2 বাইটে নির্দিষ্ট 3-বাইট পূর্ণসংখ্যার (পরিসীমা [101,355]) সংক্ষিপ্ত করতে পারেন তবে 128 ƵRযাইহোক হতে পারে .. আমি 16-র জন্য 2 বাইট বিল্টিন সম্পর্কে একই জিনিসটিও ভেবে দেখেছি .. সাধারণত আপনি কেবল আক্ষরিক ব্যবহার করবেন , বা অন্যথায় প্রোগ্রামটিতে কোনও সংখ্যার পিছনে থাকলে আমাদের 4o/ 4n/ থাকত। শুধুমাত্র যখন একটি অঙ্ক 16, যা আমি না ঘটতে পারে মনে করেন আগে, builtin দরকারী ..
কেভিন Cruijssen

3

স্ট্যাক্স , 8 বাইট

å→♂á╣>nt

এটি চালান এবং এটি ডিবাগ করুন

অ্যালগরিদম:

  • প্রতিটি বাইট স্থির-প্রস্থ 7 বিট অ্যারে রূপান্তর করুন।
  • এক মধ্যে সমতল বিট অ্যারে।
  • বিট অ্যারেটিকে সংখ্যায় ফিরে রূপান্তর করুন।


2

এপিএল + উইন, 22 বাইট

পূর্ণসংখ্যার ভেক্টরের জন্য অনুরোধ:

2⊥¯32↑,0 1↓⍉(8⍴2)⊤¯4↑⎕

এটি অনলাইন চেষ্টা করুন! সৌজন্যে ডায়ালগ ক্লাসিক

ব্যাখ্যা:

¯4↑⎕ Pad the vector to 4 integers from the right.

⍉(8⍴2)⊤ Convert to a matrix of 8 bit values.

,0 1↓ drop the MSBs and flatten to a vector.

2⊥¯32↑ pad bit vector to 32 bits starting at LSB and convert back to integer.

2

স্ট্যাক্স , 12 বাইট

ü╫ôà¡k2Wù}a☺

এটি চালান এবং স্ট্যাক্সএল.এক্সজে ডিবাগ করুন!

প্যাকযুক্ত (14 বাইট) এবং ব্যাখ্যা:

rk128%128i^#*+
r                 Reverse 'cuz big-endian
 k                Fold from the left using block:
  128%              Modulize by 128
      128i^#        Push 128 to the power of (one plus the iteration index)
            *       Multiply
             +      Add to the total
                  Implicit print

স্টেক্সের বেস রূপান্তর অন্তর্নির্মিত রয়েছে তবে এটি কেবল স্ট্রিংগুলিতেই কাজ করে। এটি প্রায় পূর্ণসংখ্যার তালিকায় কাজ করে যদিও; সমস্যাটি স্ট্যাক্সের পরিচালনার ক্ষেত্রে 0

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

10 বাইট, জিরোতে ব্যর্থ

Ç┘_A♥∙QZ►╣
{128%m128|b    Unpacked
{128%m         Modulize each by 128
      128|b    Convert from base 128

এটি চালান এবং স্ট্যাক্সএল.এক্সজে ডিবাগ করুন!


1
আমি দেখি যে সমস্যাটি কোথা থেকে এসেছে। {:B7)m$:b8 এ প্যাক করে এবং এটিও কাজ করে বলে মনে হচ্ছে, যদিও এটি এক ধরনের বহিরাগত ব্যবহার $
8:38

পুনঃটুইট এটি একটি পৃথক উত্তর হিসাবে পোস্ট করুন।
খুলদ্রেশেথ না'বাড়িয়া


2

সি (জিসিসি) , 48 বাইট

ইনপুট হিসাবে বড়-এন্ডিয়ান অর্ডারে একটি পূর্ণসংখ্যা নেয়, যা বাইট অ্যারের মতো একই ক্রম।

f(i,j){for(j=0;j|=i&127,i&128;j<<=7,i>>=8);i=j;}

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

সি (জিসিসি) , 53 বাইট

যদি বাইট অ্যারের প্রয়োজন হয়:

f(c,j)char*c;{for(j=0;j|=*c&127,*c++&128;j<<=7);c=j;}

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


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

@qwr টিআইও এর ডিফল্ট -O0, যা আপনাকে (সাধারণত) প্রথম প্যারামিটারে একটি রিটার্ন মান সংরক্ষণ করতে দেয়। কোড গল্ফিংয়ের ক্ষেত্রে এটি একটি মাতাল ^ ফাইফেরেশন, তবে উচ্চতর অপ্টিমাইজেশন স্তরগুলির সাথে কাজ করে না।
এরিকএফ

আপনি প্রতিস্থাপন দ্বারা একটি বাইট বন্ধ শেভ করতে &128সঙ্গে >>7
জি স্লিপেন

2

MathGolf , 14 বাইট

ê♣%hrx♣▬^mÅε*Σ

পূর্ণসংখ্যা হিসাবে ইনপুট।

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

আমার এই অনুভূতিটি আরও সংক্ষিপ্ত হতে পারে .. এটা কিছুটা বিরক্তিকর যে ম্যাথগল্ফের ধ্রুবকটির জন্য 1-বাইট অন্তর্নির্মিত আছে 128, তবে কোনও বেস-রূপান্তর নেই (বাইনারি / হেক্সাডেসিমাল বাদে)।

ব্যাখ্যা:

ê              # Take the inputs as integer-array
 ♣%            # Take modulo-128 on each value in this array
   h           # Push the length of the array (without popping the array itself)
    r          # Pop and push a list in the range [0, length)
     x         # Reverse the array to (length, 0]
      ♣▬       # Take 128 to the power of each value in this array
        ^      # Zip the two lists together to create pairs
         mÅ    # Map each pair to (using the following two commands):
           ε*  #  Reduce by multiplication (so basically the product of the pair)
             Σ # After multiplying each pair, take the total sum
               # (after which the entire stack joined together is output implicitly)

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

2

পাইথন 3 , 58 49 বাইট

-9 বাইটস @ চাস এবং @ আর 4093 কে ধন্যবাদ thanks

lambda x:int("".join(bin(a|128)[3:]for a in x),2)

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

অথবা

lambda x:int("".join(f"{a%128:07b}"for a in x),2)

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

পূর্ণসংখ্যার তালিকার মাধ্যমে ইনপুট।

পাইথনের binফাংশনটি স্ট্রিংয়ের শুরুতে "0 বি" যুক্ত করে, তাই এগুলি সংক্ষিপ্ত করার আগে তাদের সরিয়ে নিতে হবে। এটি নেতৃস্থানীয় শূন্যগুলি রাখে না, সুতরাং যদি কোনও (ওরফে শেষ বাইট) না থাকে তবে সেগুলি আবার যুক্ত করতে হবে And আমরা হব.সর্বদা প্রথম বিটটি সেট করে, আমি কেবল প্রথম তিনটি অক্ষর সরিয়ে ফেলতে পারি এবং এটি করার জন্য @ চাসকে ধন্যবাদ জানাই।

স্পষ্টতই (@ ar4093 অনুসারে) formatফাংশনটি কেবল '0 বি' উপসর্গটিই নয়, প্রথম বিটটি সরিয়ে এবং একই সাথে 7 টি অক্ষরকে প্যাডিং দেয়।


সিজিসিসিতে আপনাকে স্বাগতম, যা আপনাকে আরও খারাপ প্রোগ্রামার করে তুলবে! :)। প্রথমে তোমার মত আমারও একই চিন্তা ছিল। আপনার bin(a|128)[3:]প্রয়োজন নেই এমন 9 টি বাইট সংরক্ষণ করতে পারেন zfill
চ্যাস ব্রাউন

যেমনটি আপনি বলেছেন, ফর্ম্যাট ফাংশন সহ আপনি 9 বাইট সংরক্ষণ করতে পারবেন: bin(a)[2:].zfill(8)[1:]->f"{a%128:07b}"
ar4093


1

জাপট , ১০ 8 বাইট

পূর্ণসংখ্যার অ্যারের হিসাবে ইনপুট নেয়।

muIÑ ìIÑ

এটি ব্যবহার করে দেখুন বা সমস্ত পরীক্ষার কেস চালান (চ্যালেঞ্জ হিসাবে ব্যবহৃত ইনপুট ফর্ম্যাট থেকে উভয় রূপান্তরকারী শিরোনাম)

আলেফালফের সমাধান থেকে অনুপ্রেরণা নিয়ে 2 বাইট সংরক্ষণ করেছেন ।

muIÑ ìIÑ     :Implicit input of integer array
m            :Map
 u           :  Modulo
  I          :    64
   Ñ         :    Multiply by 2
     ì       :Convert to decimal
      IÑ     :  From base 64*2



1

উইন্ডোজ ব্যাচ, 76 বাইট

:a
@set/ax="%1&127",y=y*128+x
@if %2. neq . @shift&goto:a
@echo %y%

"0x" এবং স্থানের (যেমন 0xC0 0x80 0x80 0x00) এর সাথে পূর্ববর্তী পরামিতিগুলি পাস করুন।


সুন্দরভাবে সম্পন্ন. স্পষ্টতই অন্য যে কেউ এটির পরীক্ষার জন্য, আপনাকে @set y=,ax=রানের মধ্যে একটি করার বিষয়টি নিশ্চিত করতে হবে ।
640KB

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